Add crash fix, initial-setup fix, and simpledrm fix

This commit is contained in:
Ray Strode 2023-08-29 12:20:36 -04:00
parent 8bdde9a816
commit 01cbfb3cc0
3 changed files with 282 additions and 0 deletions

View File

@ -0,0 +1,79 @@
From 7f5fe3848efe2e6b5a8c5a4fb952990759f3ca59 Mon Sep 17 00:00:00 2001
From: Ghadi Rahme <ghadi.rahme@canonical.com>
Date: Wed, 28 Jun 2023 17:07:12 +0000
Subject: [PATCH] Clearing signal handler after udev settle or timeout to avoid
sudden logout
---
daemon/gdm-local-display-factory.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 471e1b460..c10c1ef6c 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -628,60 +628,61 @@ lookup_prepared_display_by_seat_id (const char *id,
status = gdm_display_get_status (display);
if (status != GDM_DISPLAY_PREPARED)
return FALSE;
return lookup_by_seat_id (id, display, user_data);
}
#ifdef HAVE_UDEV
static gboolean
udev_is_settled (GdmLocalDisplayFactory *factory)
{
g_autoptr (GUdevEnumerator) enumerator = NULL;
GList *devices;
GList *node;
gboolean is_settled = FALSE;
if (factory->seat0_has_platform_graphics) {
g_debug ("GdmLocalDisplayFactory: udev settled, platform graphics enabled.");
return TRUE;
}
if (factory->seat0_has_boot_up_graphics) {
g_debug ("GdmLocalDisplayFactory: udev settled, boot up graphics available.");
return TRUE;
}
if (factory->seat0_graphics_check_timed_out) {
g_debug ("GdmLocalDisplayFactory: udev timed out, proceeding anyway.");
+ g_clear_signal_handler (&factory->uevent_handler_id, factory->gudev_client);
return TRUE;
}
g_debug ("GdmLocalDisplayFactory: Checking if udev has settled enough to support graphics.");
enumerator = g_udev_enumerator_new (factory->gudev_client);
g_udev_enumerator_add_match_name (enumerator, "card*");
g_udev_enumerator_add_match_tag (enumerator, "master-of-seat");
g_udev_enumerator_add_match_subsystem (enumerator, "drm");
devices = g_udev_enumerator_execute (enumerator);
if (!devices) {
g_debug ("GdmLocalDisplayFactory: udev has no candidate graphics devices available yet.");
return FALSE;
}
node = devices;
while (node != NULL) {
GUdevDevice *device = node->data;
GList *next_node = node->next;
g_autoptr (GUdevDevice) platform_device = NULL;
g_autoptr (GUdevDevice) pci_device = NULL;
platform_device = g_udev_device_get_parent_with_subsystem (device, "platform", NULL);
if (platform_device != NULL) {
g_debug ("GdmLocalDisplayFactory: Found embedded platform graphics, proceeding.");
factory->seat0_has_platform_graphics = TRUE;
is_settled = TRUE;
--
2.41.0.rc2

View File

@ -0,0 +1,104 @@
From 1580f05a56b671950a23d267c815a977cd56655b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 28 Jun 2023 13:55:01 +0200
Subject: [PATCH] daemon: Specify DCONF_PROFILE for initial-setup
Since commit edc1815175, the initial-setup session no longer uses
the locked down "gdm" profile, but the regular user profile.
On the one hand this seems justified, given that the initial-setup
session is different enough from the login screen, however it is
also different from a regular user session:
- screen locking isn't useful for a system user
- during setup, log out / user switching are pointless at best
- accessibility features should be readily available in case
the user needs them
For this reason, return to specify DCONF_PROFILE for the initial-setup
user, but use a distince profile from "gdm" to allow initial-setup
to provide its own presets.
---
daemon/gdm-launch-environment.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c
index 507d6de74..5e379bf85 100644
--- a/daemon/gdm-launch-environment.c
+++ b/daemon/gdm-launch-environment.c
@@ -155,71 +155,67 @@ build_launch_environment (GdmLaunchEnvironment *launch_environment,
"LC_TIME",
"LD_LIBRARY_PATH",
"PATH",
"WINDOWPATH",
"XCURSOR_PATH",
"XDG_CONFIG_DIRS",
NULL
};
char *system_data_dirs;
g_auto (GStrv) supported_session_types = NULL;
int i;
/* create a hash table of current environment, then update keys has necessary */
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
for (i = 0; optional_environment[i] != NULL; i++) {
if (g_getenv (optional_environment[i]) == NULL) {
continue;
}
g_hash_table_insert (hash,
g_strdup (optional_environment[i]),
g_strdup (g_getenv (optional_environment[i])));
}
if (launch_environment->x11_authority_file != NULL)
g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (launch_environment->x11_authority_file));
if (launch_environment->session_mode != NULL) {
g_hash_table_insert (hash, g_strdup ("GNOME_SHELL_SESSION_MODE"), g_strdup (launch_environment->session_mode));
+ g_hash_table_insert (hash, g_strdup ("DCONF_PROFILE"), g_strdup (launch_environment->user_name));
if (strcmp (launch_environment->session_mode, INITIAL_SETUP_SESSION_MODE) != 0) {
/* gvfs is needed for fetching remote avatars in the initial setup. Disable it otherwise. */
g_hash_table_insert (hash, g_strdup ("GVFS_DISABLE_FUSE"), g_strdup ("1"));
g_hash_table_insert (hash, g_strdup ("GIO_USE_VFS"), g_strdup ("local"));
g_hash_table_insert (hash, g_strdup ("GVFS_REMOTE_VOLUME_MONITOR_IGNORE"), g_strdup ("1"));
-
- /* The locked down dconf profile should not be used for the initial setup session.
- * This allows overridden values from the user profile to take effect.
- */
- g_hash_table_insert (hash, g_strdup ("DCONF_PROFILE"), g_strdup ("gdm"));
}
}
g_hash_table_insert (hash, g_strdup ("LOGNAME"), g_strdup (launch_environment->user_name));
g_hash_table_insert (hash, g_strdup ("USER"), g_strdup (launch_environment->user_name));
g_hash_table_insert (hash, g_strdup ("USERNAME"), g_strdup (launch_environment->user_name));
g_hash_table_insert (hash, g_strdup ("GDM_VERSION"), g_strdup (VERSION));
g_hash_table_remove (hash, "MAIL");
g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup ("/"));
g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup ("/"));
g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup ("/bin/sh"));
gdm_get_pwent_for_name (launch_environment->user_name, &pwent);
if (pwent != NULL) {
if (pwent->pw_dir != NULL && pwent->pw_dir[0] != '\0') {
g_hash_table_insert (hash, g_strdup ("HOME"), g_strdup (pwent->pw_dir));
g_hash_table_insert (hash, g_strdup ("PWD"), g_strdup (pwent->pw_dir));
}
g_hash_table_insert (hash, g_strdup ("SHELL"), g_strdup (pwent->pw_shell));
}
if (start_session && launch_environment->x11_display_seat_id != NULL) {
char *seat_id;
seat_id = launch_environment->x11_display_seat_id;
g_hash_table_insert (hash, g_strdup ("GDM_SEAT_ID"), g_strdup (seat_id));
--
2.41.0.rc2

View File

@ -0,0 +1,99 @@
From b6b05961f76e9a8ac7697f61a78bc07bec933964 Mon Sep 17 00:00:00 2001
From: Mario Limonciello <mario.limonciello@amd.com>
Date: Thu, 24 Aug 2023 13:39:51 -0500
Subject: [PATCH] local-display-factory: Skip simpledrm while checking for
settled
Some platforms the DRM driver may take more time to load and this
will mean that GDM starts up using simpledrm instead of the proper
KMS driver.
To avoid this problem, skip simpledrm when checking if a given node
is settled.
Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2909
Suggested-by: Ray Strode <halfline@gmail.com>
Tested-by: Mario Limonciello <mario.limonciello@amd.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
---
daemon/gdm-local-display-factory.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index c10c1ef6c..9a1012103 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -650,63 +650,69 @@ udev_is_settled (GdmLocalDisplayFactory *factory)
if (factory->seat0_has_boot_up_graphics) {
g_debug ("GdmLocalDisplayFactory: udev settled, boot up graphics available.");
return TRUE;
}
if (factory->seat0_graphics_check_timed_out) {
g_debug ("GdmLocalDisplayFactory: udev timed out, proceeding anyway.");
g_clear_signal_handler (&factory->uevent_handler_id, factory->gudev_client);
return TRUE;
}
g_debug ("GdmLocalDisplayFactory: Checking if udev has settled enough to support graphics.");
enumerator = g_udev_enumerator_new (factory->gudev_client);
g_udev_enumerator_add_match_name (enumerator, "card*");
g_udev_enumerator_add_match_tag (enumerator, "master-of-seat");
g_udev_enumerator_add_match_subsystem (enumerator, "drm");
devices = g_udev_enumerator_execute (enumerator);
if (!devices) {
g_debug ("GdmLocalDisplayFactory: udev has no candidate graphics devices available yet.");
return FALSE;
}
node = devices;
while (node != NULL) {
GUdevDevice *device = node->data;
GList *next_node = node->next;
+ const gchar *id_path = g_udev_device_get_property (device, "ID_PATH");
g_autoptr (GUdevDevice) platform_device = NULL;
g_autoptr (GUdevDevice) pci_device = NULL;
+ if (g_str_has_prefix (id_path, "platform-simple-framebuffer")) {
+ node = next_node;
+ continue;
+ }
+
platform_device = g_udev_device_get_parent_with_subsystem (device, "platform", NULL);
if (platform_device != NULL) {
g_debug ("GdmLocalDisplayFactory: Found embedded platform graphics, proceeding.");
factory->seat0_has_platform_graphics = TRUE;
is_settled = TRUE;
break;
}
pci_device = g_udev_device_get_parent_with_subsystem (device, "pci", NULL);
if (pci_device != NULL) {
gboolean boot_vga;
boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga");
if (boot_vga == 1) {
g_debug ("GdmLocalDisplayFactory: Found primary PCI graphics adapter, proceeding.");
factory->seat0_has_boot_up_graphics = TRUE;
is_settled = TRUE;
break;
} else {
g_debug ("GdmLocalDisplayFactory: Found secondary PCI graphics adapter, not proceeding yet.");
}
}
node = next_node;
}
g_debug ("GdmLocalDisplayFactory: udev has %ssettled enough for graphics.", is_settled? "" : "not ");
g_list_free_full (devices, g_object_unref);
--
2.41.0.rc2