[mutter/wip/carlosg/rtkit] backends/native: Use rtkit to get realtime priority
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/rtkit] backends/native: Use rtkit to get realtime priority
- Date: Thu, 21 Oct 2021 20:49:07 +0000 (UTC)
commit 9afdf3187c30f36a8e4d16a05b1cf619b82320f8
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Oct 21 13:40:55 2021 +0200
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
data/org.gnome.mutter.gschema.xml.in | 4 +--
src/backends/native/meta-backend-native.c | 39 +++++++++++++++++++++-------
src/meson.build | 7 ++++++
src/org.freedesktop.RealtimeKit1.xml | 42 +++++++++++++++++++++++++++++++
4 files changed, 80 insertions(+), 12 deletions(-)
---
diff --git a/data/org.gnome.mutter.gschema.xml.in b/data/org.gnome.mutter.gschema.xml.in
index 23fa9f3ad3..db7c840aac 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 99b11a69d8..fcb6b021aa 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 <sched.h>
#include <stdlib.h>
#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)
- };
-
- retval = sched_setscheduler (0, SCHED_RR | SCHED_RESET_ON_FORK, &sp);
+ g_autoptr (MetaDbusRealtimeKit1) rtkit_proxy = NULL;
+ g_autoptr (GError) error = NULL;
+
+ 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 (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 (retval != 0)
- g_warning ("Failed to set RT scheduler: %m");
+ 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 655b5bfcab..ecf441324c 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 0000000000..305e767b14
--- /dev/null
+++ b/src/org.freedesktop.RealtimeKit1.xml
@@ -0,0 +1,42 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.RealtimeKit1">
+ <method name="MakeThreadRealtime">
+ <arg name="thread" type="t" direction="in"/>
+ <arg name="priority" type="u" direction="in"/>
+ </method>
+ <method name="MakeThreadRealtimeWithPID">
+ <arg name="process" type="t" direction="in"/>
+ <arg name="thread" type="t" direction="in"/>
+ <arg name="priority" type="u" direction="in"/>
+ </method>
+ <method name="MakeThreadHighPriority">
+ <arg name="thread" type="t" direction="in"/>
+ <arg name="priority" type="i" direction="in"/>
+ </method>
+ <method name="MakeThreadHighPriorityWithPID">
+ <arg name="process" type="t" direction="in"/>
+ <arg name="thread" type="t" direction="in"/>
+ <arg name="priority" type="i" direction="in"/>
+ </method>
+ <method name="ResetKnown"/>
+ <method name="ResetAll"/>
+ <method name="Exit"/>
+ <property name="RTTimeUSecMax" type="x" access="read"/>
+ <property name="MaxRealtimePriority" type="i" access="read"/>
+ <property name="MinNiceLevel" type="i" access="read"/>
+ </interface>
+ <interface name="org.freedesktop.DBus.Properties">
+ <method name="Get">
+ <arg name="interface" direction="in" type="s"/>
+ <arg name="property" direction="in" type="s"/>
+ <arg name="value" direction="out" type="v"/>
+ </method>
+ </interface>
+ <interface name="org.freedesktop.DBus.Introspectable">
+ <method name="Introspect">
+ <arg name="data" type="s" direction="out"/>
+ </method>
+ </interface>
+</node>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]