Merged upstream into master, this is the backport PR variant. https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/833 https://bugs.gentoo.org/829496 From: Jocelyn Falempe Date: Thu, 16 Dec 2021 15:46:43 +0100 Subject: [PATCH 1/2] xf86/logind: Fix compilation error when built without logind/platform bus This was introduced by commit 8eb1396d Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1269 Fixes: da9d012a9 - xf86/logind: Fix drm_drop_master before vt_reldisp Signed-off-by: Jocelyn Falempe Reviewed-by: Hans de Goede --- a/hw/xfree86/common/xf86Events.c +++ b/hw/xfree86/common/xf86Events.c @@ -383,14 +383,7 @@ xf86VTLeave(void) xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]); if (systemd_logind_controls_session()) { - for (i = 0; i < xf86_num_platform_devices; i++) { - if (xf86_platform_devices[i].flags & XF86_PDEV_SERVER_FD) { - int major, minor; - major = xf86_platform_odev_attributes(i)->major; - minor = xf86_platform_odev_attributes(i)->minor; - systemd_logind_drop_master(major, minor); - } - } + systemd_logind_drop_master(); } if (!xf86VTSwitchAway()) --- a/hw/xfree86/os-support/linux/systemd-logind.c +++ b/hw/xfree86/os-support/linux/systemd-logind.c @@ -308,13 +308,19 @@ cleanup: * and ensure the drm_drop_master is done before * VT_RELDISP when switching VT */ -void systemd_logind_drop_master(int _major, int _minor) +void systemd_logind_drop_master(void) { - struct systemd_logind_info *info = &logind_info; - dbus_int32_t major = _major; - dbus_int32_t minor = _minor; + int i; + for (i = 0; i < xf86_num_platform_devices; i++) { + if (xf86_platform_devices[i].flags & XF86_PDEV_SERVER_FD) { + dbus_int32_t major, minor; + struct systemd_logind_info *info = &logind_info; - systemd_logind_ack_pause(info, minor, major); + major = xf86_platform_odev_attributes(i)->major; + minor = xf86_platform_odev_attributes(i)->minor; + systemd_logind_ack_pause(info, minor, major); + } + } } static DBusHandlerResult --- a/include/systemd-logind.h +++ b/include/systemd-logind.h @@ -33,7 +33,7 @@ int systemd_logind_take_fd(int major, int minor, const char *path, Bool *paus); void systemd_logind_release_fd(int major, int minor, int fd); int systemd_logind_controls_session(void); void systemd_logind_vtenter(void); -void systemd_logind_drop_master(int major, int minor); +void systemd_logind_drop_master(void); #else #define systemd_logind_init() #define systemd_logind_fini() @@ -41,7 +41,7 @@ void systemd_logind_drop_master(int major, int minor); #define systemd_logind_release_fd(major, minor, fd) close(fd) #define systemd_logind_controls_session() 0 #define systemd_logind_vtenter() -#define systemd_logind_drop_master(major, minor) +#define systemd_logind_drop_master() #endif #endif GitLab From 66890ca569291a53ea9cdc6ec19070173e522260 Mon Sep 17 00:00:00 2001 From: Jocelyn Falempe Date: Fri, 17 Dec 2021 10:18:25 +0100 Subject: [PATCH 2/2] xf86/logind: fix missing call to vtenter if the platform device is not paused If there is one platform device, which is not paused nor resumed, systemd_logind_vtenter() will never get called. This break suspend/resume, and switching to VT on system with Nvidia proprietary driver. This is a regression introduced by f5bd039633fa83 So now call systemd_logind_vtenter() if there are no paused platform devices. Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1271 Fixes: f5bd0396 - xf86/logind: fix call systemd_logind_vtenter after receiving drm device resume Signed-off-by: Jocelyn Falempe Tested-by: Olivier Fourdan Reviewed-by: Hans de Goede --- a/hw/xfree86/os-support/linux/systemd-logind.c +++ b/hw/xfree86/os-support/linux/systemd-logind.c @@ -316,6 +316,7 @@ void systemd_logind_drop_master(void) dbus_int32_t major, minor; struct systemd_logind_info *info = &logind_info; + xf86_platform_devices[i].flags |= XF86_PDEV_PAUSED; major = xf86_platform_odev_attributes(i)->major; minor = xf86_platform_odev_attributes(i)->minor; systemd_logind_ack_pause(info, minor, major); @@ -323,6 +324,16 @@ void systemd_logind_drop_master(void) } } +static Bool are_platform_devices_resumed(void) { + int i; + for (i = 0; i < xf86_num_platform_devices; i++) { + if (xf86_platform_devices[i].flags & XF86_PDEV_PAUSED) { + return FALSE; + } + } + return TRUE; +} + static DBusHandlerResult message_filter(DBusConnection * connection, DBusMessage * message, void *data) { @@ -416,13 +427,11 @@ message_filter(DBusConnection * connection, DBusMessage * message, void *data) if (pdev) { pdev->flags &= ~XF86_PDEV_PAUSED; - systemd_logind_vtenter(); } else systemd_logind_set_input_fd_for_all_devs(major, minor, fd, info->vt_active); - - /* Always call vtenter(), only if there are only legacy video devs */ - if (!xf86_num_platform_devices) + /* Call vtenter if all platform devices are resumed, or if there are no platform device */ + if (are_platform_devices_resumed()) systemd_logind_vtenter(); } return DBUS_HANDLER_RESULT_HANDLED; GitLab