From aae0955e6718de9084a6679fcd796cf8bd2cdef7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
Date: Thu, 9 Apr 2026 15:08:50 +0200
Subject: [PATCH] Revert "kms/impl-device: Remove
 META_DEADLINE_TIMER_STATE_INHIBITED"

This reverts commit 2792ee7984d511a5d875f9a2f306619ee03ba3f7.

While this seemed to work well enough on some systems with the nvidia
driver, it caused issues on others.

Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/4724
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/5018>
---
 src/backends/native/meta-kms-impl-device.c | 29 +++++++++++++++++++---
 src/backends/native/meta-kms-impl-device.h |  2 ++
 src/backends/native/meta-kms-impl.c        | 14 +++++++++++
 src/backends/native/meta-kms-impl.h        |  2 ++
 src/backends/native/meta-kms.c             | 13 ++++++++++
 5 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 0ba39bcd72d..e8915c169e7 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -92,6 +92,7 @@ typedef enum _MetaDeadlineTimerState
 {
   META_DEADLINE_TIMER_STATE_ENABLED,
   META_DEADLINE_TIMER_STATE_DISABLED,
+  META_DEADLINE_TIMER_STATE_INHIBITED,
 } MetaDeadlineTimerState;
 
 typedef struct _MetaKmsImplDevicePrivate
@@ -1415,9 +1416,21 @@ ensure_deadline_timer_armed (MetaKmsImplDevice *impl_device,
                                          &next_presentation_us,
                                          &local_error))
     {
-      meta_topic (META_DEBUG_KMS_DEADLINE,
-                  "Could not determine deadline: %s",
-                  local_error->message);
+      MetaKmsImplDevicePrivate *priv =
+        meta_kms_impl_device_get_instance_private (impl_device);
+
+      if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED))
+        {
+          meta_topic (META_DEBUG_KMS, "Could not determine deadline: %s",
+                      local_error->message);
+
+          priv->deadline_timer_state = META_DEADLINE_TIMER_STATE_INHIBITED;
+        }
+      else
+        {
+          g_warning ("Failed to determine deadline: %s", local_error->message);
+          priv->deadline_timer_state = META_DEADLINE_TIMER_STATE_DISABLED;
+        }
 
       return FALSE;
     }
@@ -2594,6 +2607,16 @@ meta_kms_impl_device_init_mode_setting (MetaKmsImplDevice  *impl_device,
   return TRUE;
 }
 
+void
+meta_kms_impl_device_resume (MetaKmsImplDevice *impl_device)
+{
+  MetaKmsImplDevicePrivate *priv =
+    meta_kms_impl_device_get_instance_private (impl_device);
+
+  if (priv->deadline_timer_state == META_DEADLINE_TIMER_STATE_INHIBITED)
+    priv->deadline_timer_state = META_DEADLINE_TIMER_STATE_ENABLED;
+}
+
 void
 meta_kms_impl_device_prepare_shutdown (MetaKmsImplDevice *impl_device)
 {
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index 0818d417b59..9b02a3a4c1e 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -215,6 +215,8 @@ void meta_kms_impl_device_discard_pending_page_flips (MetaKmsImplDevice *impl_de
 gboolean meta_kms_impl_device_init_mode_setting (MetaKmsImplDevice  *impl_device,
                                                  GError            **error);
 
+void meta_kms_impl_device_resume (MetaKmsImplDevice *impl_device);
+
 void meta_kms_impl_device_prepare_shutdown (MetaKmsImplDevice *impl_device);
 
 uint64_t meta_kms_prop_convert_value (MetaKmsProp *prop,
diff --git a/src/backends/native/meta-kms-impl.c b/src/backends/native/meta-kms-impl.c
index 630621597e3..e34af982023 100644
--- a/src/backends/native/meta-kms-impl.c
+++ b/src/backends/native/meta-kms-impl.c
@@ -84,6 +84,20 @@ meta_kms_impl_discard_pending_page_flips (MetaKmsImpl *impl)
                   NULL);
 }
 
+void
+meta_kms_impl_resume (MetaKmsImpl *impl)
+{
+  MetaKmsImplPrivate *priv = meta_kms_impl_get_instance_private (impl);
+  GList *l;
+
+  for (l = priv->impl_devices; l; l = l->next)
+    {
+      MetaKmsImplDevice *impl_device = l->data;
+
+      meta_kms_impl_device_resume (impl_device);
+    }
+}
+
 void
 meta_kms_impl_prepare_shutdown (MetaKmsImpl *impl)
 {
diff --git a/src/backends/native/meta-kms-impl.h b/src/backends/native/meta-kms-impl.h
index 30d6649fa11..582bebf5e66 100644
--- a/src/backends/native/meta-kms-impl.h
+++ b/src/backends/native/meta-kms-impl.h
@@ -45,6 +45,8 @@ void meta_kms_impl_remove_impl_device (MetaKmsImpl       *impl,
 
 void meta_kms_impl_discard_pending_page_flips (MetaKmsImpl *impl);
 
+void meta_kms_impl_resume (MetaKmsImpl *impl);
+
 void meta_kms_impl_prepare_shutdown (MetaKmsImpl *impl);
 
 void meta_kms_impl_notify_modes_set (MetaKmsImpl *impl);
diff --git a/src/backends/native/meta-kms.c b/src/backends/native/meta-kms.c
index edf7b0b572e..74cf277c2ca 100644
--- a/src/backends/native/meta-kms.c
+++ b/src/backends/native/meta-kms.c
@@ -267,10 +267,23 @@ static void
 #define meta_kms_update_resources(kms, hotplug_event, changes) \
   (meta_kms_update_resources) ((kms), (hotplug_event), (changes), G_STRFUNC);
 
+static gpointer
+resume_in_impl (MetaThreadImpl  *thread_impl,
+                gpointer         user_data,
+                GError         **error)
+{
+  MetaKmsImpl *impl = META_KMS_IMPL (thread_impl);
+
+  meta_kms_impl_resume (impl);
+  return GINT_TO_POINTER (TRUE);
+}
+
 void
 meta_kms_resume (MetaKms *kms)
 {
   meta_kms_update_resources (kms, NULL, META_KMS_RESOURCE_CHANGE_FULL);
+
+  meta_kms_run_impl_task_sync (kms, resume_in_impl, NULL, NULL);
 }
 
 static char *
-- 
GitLab

