[mutter/wip/carlosg/rt-scheduler: 13/13] backends/native: Add rt-scheduler experimental key to set RT scheduling



commit 3593710594d98feef63fce8171c6168e5faf43d6
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Feb 27 19:02:25 2019 +0100

    backends/native: Add rt-scheduler experimental key to set RT scheduling
    
    This is similar to a change in kwin:
    https://blog.martin-graesslin.com/blog/2017/09/kwinwayland-goes-real-time/
    
    If the experimental features key has "rt-scheduler", make it claim the lowest
    of RT scheduler priorities, this will be both educated to other RT processes
    and improves responsiveness wrt all other processes.
    
    This can only work if mutter/gnome-shell process receives CAP_SYS_ADMIN
    somehow.
    
    Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/921
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/460

 data/org.gnome.mutter.gschema.xml.in      |  4 ++++
 src/backends/meta-settings-private.h      |  1 +
 src/backends/meta-settings.c              |  2 ++
 src/backends/native/meta-backend-native.c | 16 ++++++++++++++++
 4 files changed, 23 insertions(+)
---
diff --git a/data/org.gnome.mutter.gschema.xml.in b/data/org.gnome.mutter.gschema.xml.in
index 6cbd9c1b5..8701719e5 100644
--- a/data/org.gnome.mutter.gschema.xml.in
+++ b/data/org.gnome.mutter.gschema.xml.in
@@ -120,6 +120,10 @@
                                         framebuffers instead of window content,
                                         to manage HiDPI monitors. Does not
                                         require a restart.
+        • “rt-scheduler”              — makes mutter request a low priority
+                                        real-time scheduling. The executable
+                                        or user must have CAP_SYS_ADMIN.
+                                        Requires a restart.
       </description>
     </key>
 
diff --git a/src/backends/meta-settings-private.h b/src/backends/meta-settings-private.h
index 619de1710..9f07940b7 100644
--- a/src/backends/meta-settings-private.h
+++ b/src/backends/meta-settings-private.h
@@ -33,6 +33,7 @@ typedef enum _MetaExperimentalFeature
   META_EXPERIMENTAL_FEATURE_NONE = 0,
   META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
   META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS  = (1 << 1),
+  META_EXPERIMENTAL_FEATURE_RT_SCHEDULER = (1 << 2),
 } MetaExperimentalFeature;
 
 #define META_TYPE_SETTINGS (meta_settings_get_type ())
diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c
index 34d49b3ed..bc17969da 100644
--- a/src/backends/meta-settings.c
+++ b/src/backends/meta-settings.c
@@ -264,6 +264,8 @@ experimental_features_handler (GVariant *features_variant,
         features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER;
       else if (g_str_equal (feature, "kms-modifiers"))
         features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS;
+      else if (g_str_equal (feature, "rt-scheduler"))
+        features |= META_EXPERIMENTAL_FEATURE_RT_SCHEDULER;
       else
         g_info ("Unknown experimental feature '%s'\n", feature);
     }
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index c473681cb..c913cd6d3 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -44,6 +44,7 @@
 #include "backends/meta-logical-monitor.h"
 #include "backends/meta-monitor-manager-private.h"
 #include "backends/meta-pointer-constraint.h"
+#include "backends/meta-settings-private.h"
 #include "backends/meta-stage-private.h"
 #include "backends/native/meta-barrier-native.h"
 #include "backends/native/meta-clutter-backend-native.h"
@@ -331,6 +332,7 @@ static void
 meta_backend_native_post_init (MetaBackend *backend)
 {
   ClutterDeviceManager *manager = clutter_device_manager_get_default ();
+  MetaSettings *settings = meta_backend_get_settings (backend);
 
   META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
 
@@ -338,6 +340,20 @@ meta_backend_native_post_init (MetaBackend *backend)
                                                 NULL, NULL);
   clutter_evdev_set_relative_motion_filter (manager, relative_motion_filter,
                                             meta_backend_get_monitor_manager (backend));
+
+  if (meta_settings_is_experimental_feature_enabled (settings,
+                                                     META_EXPERIMENTAL_FEATURE_RT_SCHEDULER))
+    {
+      int retval;
+      struct sched_param sp = {
+        .sched_priority = sched_get_priority_min (SCHED_RR)
+      };
+
+      retval = sched_setscheduler (0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
+
+      if (retval != 0)
+        g_warning ("Failed to set RT scheduler: %m");
+    }
 }
 
 static MetaMonitorManager *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]