From 820aa18126674dcee73f47afb23ed89b57251e2d Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 21 Oct 2021 13:40:55 +0200 Subject: [PATCH] backends/native: Use rtkit to get realtime priority Instead of using sched_setscheduler directly (and relying that we somehow got CAP_SYS_NICE), use rtkit to do this for us. Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/2284 Part-of: --- data/org.gnome.mutter.gschema.xml.in | 4 +-- src/backends/native/meta-backend-native.c | 37 +++++++++++++++----- src/meson.build | 7 ++++ src/org.freedesktop.RealtimeKit1.xml | 42 +++++++++++++++++++++++ 4 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 src/org.freedesktop.RealtimeKit1.xml diff --git a/data/org.gnome.mutter.gschema.xml.in b/data/org.gnome.mutter.gschema.xml.in index 23fa9f3ad..db7c840aa 100644 --- a/data/org.gnome.mutter.gschema.xml.in +++ b/data/org.gnome.mutter.gschema.xml.in @@ -122,9 +122,7 @@ require a restart. • “rt-scheduler” — makes mutter request a low priority - real-time scheduling. The executable - or user must have CAP_SYS_NICE. - Requires a restart. + real-time scheduling. Requires a restart. • “dma-buf-screen-sharing" — enables DMA buffered screen sharing. This is already enabled by default when using diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c index 99b11a69d..fcb6b021a 100644 --- a/src/backends/native/meta-backend-native.c +++ b/src/backends/native/meta-backend-native.c @@ -38,7 +38,6 @@ #include "backends/native/meta-backend-native-private.h" #include "backends/native/meta-input-thread.h" -#include #include #include "backends/meta-cursor-tracker-private.h" @@ -61,6 +60,7 @@ #include "cogl/cogl.h" #include "core/meta-border.h" #include "meta/main.h" +#include "meta-dbus-rtkit1.h" #ifdef HAVE_REMOTE_DESKTOP #include "backends/meta-screen-cast.h" @@ -209,15 +209,36 @@ meta_backend_native_post_init (MetaBackend *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) - }; + g_autoptr (MetaDbusRealtimeKit1) rtkit_proxy = NULL; + g_autoptr (GError) error = NULL; - retval = sched_setscheduler (0, SCHED_RR | SCHED_RESET_ON_FORK, &sp); + rtkit_proxy = + meta_dbus_realtime_kit1_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | + G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS | + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, + "org.freedesktop.RealtimeKit1", + "/org/freedesktop/RealtimeKit1", + NULL, + &error); - if (retval != 0) - g_warning ("Failed to set RT scheduler: %m"); + if (rtkit_proxy) + { + uint32_t priority; + + priority = sched_get_priority_min (SCHED_RR); + meta_dbus_realtime_kit1_call_make_thread_realtime_sync (rtkit_proxy, + gettid (), + priority, + NULL, + &error); + } + + if (error) + { + g_dbus_error_strip_remote_error (error); + g_message ("Failed to set RT scheduler: %s", error->message); + } } #ifdef HAVE_REMOTE_DESKTOP diff --git a/src/meson.build b/src/meson.build index 655b5bfca..ecf441324 100644 --- a/src/meson.build +++ b/src/meson.build @@ -891,6 +891,13 @@ if have_remote_desktop mutter_built_sources += dbus_screen_cast_built_sources endif +dbus_rtkit_built_sources = gnome.gdbus_codegen('meta-dbus-rtkit1', + 'org.freedesktop.RealtimeKit1.xml', + interface_prefix: 'org.freedesktop.', + namespace: 'MetaDbus', +) +mutter_built_sources += dbus_rtkit_built_sources + wayland_protocol_server_headers = [] wayland_protocol_client_headers = [] wayland_protocol_sources = [] diff --git a/src/org.freedesktop.RealtimeKit1.xml b/src/org.freedesktop.RealtimeKit1.xml new file mode 100644 index 000000000..305e767b1 --- /dev/null +++ b/src/org.freedesktop.RealtimeKit1.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +