From f1a6fabb6c39bdcd40cd9e0ac975011bb42cdc51 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 15 Feb 2024 11:53:32 +0100 Subject: [PATCH] meson: add options to set server and client RT priority Make a rtprio-server and rtprio-client option. Leave the server priority by default to 88 but lower client priority to 83. JACK does something similar by setting clients to rtprio-server - 5. Make module-rt use the client priority by default and bump the server priority explicitly in the config file. Leave the pulse-server to the default rtprio-client, there is no reason to lower this any further because it is really just a regular client. Bump the ffado packetizer thread to rtprio-server + 5 because that is also what JACK does. 88 is still much higher than the value of 60 that JACK uses in Fedora but now this is at least configurable. --- meson.build | 2 ++ meson_options.txt | 12 ++++++++++++ pipewire-jack/src/pipewire-jack.c | 2 +- src/daemon/client-rt.conf.in | 2 +- src/daemon/filter-chain.conf.in | 2 +- src/daemon/jack.conf.in | 2 +- src/daemon/meson.build | 2 ++ src/daemon/minimal.conf.in | 2 +- src/daemon/pipewire-aes67.conf.in | 2 +- src/daemon/pipewire-avb.conf.in | 2 +- src/daemon/pipewire-pulse.conf.in | 3 +-- src/daemon/pipewire-vulkan.conf.in | 2 +- src/daemon/pipewire.conf.in | 2 +- src/modules/module-ffado-driver.c | 4 +++- src/modules/module-rt.c | 2 +- 15 files changed, 30 insertions(+), 13 deletions(-) diff --git a/meson.build b/meson.build index 5b31dabe8..51a4fce0a 100644 --- a/meson.build +++ b/meson.build @@ -220,6 +220,8 @@ cdata.set_quoted('PIPEWIRE_CONFIG_DIR', pipewire_configdir) cdata.set_quoted('PLUGINDIR', spa_plugindir) cdata.set_quoted('SPADATADIR', spa_datadir) cdata.set_quoted('PA_ALSA_DATA_DIR', alsadatadir) +cdata.set('RTPRIO_SERVER', get_option('rtprio-server')) +cdata.set('RTPRIO_CLIENT', get_option('rtprio-client')) if host_machine.endian() == 'big' cdata.set('WORDS_BIGENDIAN', 1) diff --git a/meson_options.txt b/meson_options.txt index a0fb5933e..781fc10e9 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -306,6 +306,18 @@ option('rlimits-match', description : 'PAM match rule for the generated limits.d file. @ denotes matching a group.', type : 'string', value: '@pipewire') +option('rtprio-server', + description : 'PipeWire server realtime priority', + type : 'integer', + min: 11, + max: 99, + value: 88) +option('rtprio-client', + description : 'PipeWire clients realtime priority', + type : 'integer', + min: 11, + max: 99, + value: 83) option('rlimits-rtprio', description : 'RR and FIFO scheduler priority permitted for realtime threads of the matching user(s)', type : 'integer', diff --git a/pipewire-jack/src/pipewire-jack.c b/pipewire-jack/src/pipewire-jack.c index 07aba1353..96cb4784a 100644 --- a/pipewire-jack/src/pipewire-jack.c +++ b/pipewire-jack/src/pipewire-jack.c @@ -45,7 +45,7 @@ * with mlockall() on many systems */ #define THREAD_STACK 524288 -#define DEFAULT_RT_MAX 88 +#define DEFAULT_RT_MAX RTPRIO_CLIENT #define JACK_CLIENT_NAME_SIZE 256 #define JACK_PORT_NAME_SIZE 256 diff --git a/src/daemon/client-rt.conf.in b/src/daemon/client-rt.conf.in index 8c42ab03d..ed08a5f1f 100644 --- a/src/daemon/client-rt.conf.in +++ b/src/daemon/client-rt.conf.in @@ -43,7 +43,7 @@ context.modules = [ # Uses realtime scheduling to boost the audio thread priorities { name = libpipewire-module-rt args = { - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/filter-chain.conf.in b/src/daemon/filter-chain.conf.in index d1b4cdab8..48088758a 100644 --- a/src/daemon/filter-chain.conf.in +++ b/src/daemon/filter-chain.conf.in @@ -42,7 +42,7 @@ context.modules = [ # Uses realtime scheduling to boost the audio thread priorities { name = libpipewire-module-rt args = { - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/jack.conf.in b/src/daemon/jack.conf.in index 4cf96b1c8..b3be1c681 100644 --- a/src/daemon/jack.conf.in +++ b/src/daemon/jack.conf.in @@ -43,7 +43,7 @@ context.modules = [ # Boost the data thread priority. { name = libpipewire-module-rt args = { - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/meson.build b/src/daemon/meson.build index 95f0948ff..461d519a4 100644 --- a/src/daemon/meson.build +++ b/src/daemon/meson.build @@ -11,6 +11,8 @@ conf_config.set('pipewire_path', pipewire_bindir / 'pipewire') conf_config.set('pipewire_pulse_path', pipewire_bindir / 'pipewire-pulse') conf_config.set('sm_comment', '#') conf_config.set('pulse_comment', '#') +conf_config.set('rtprio_server', get_option('rtprio-server')) +conf_config.set('rtprio_client', get_option('rtprio-client')) conf_config_uninstalled = conf_config conf_config_uninstalled.set('pipewire_path', diff --git a/src/daemon/minimal.conf.in b/src/daemon/minimal.conf.in index 21ea5b518..eadcfd2de 100644 --- a/src/daemon/minimal.conf.in +++ b/src/daemon/minimal.conf.in @@ -81,7 +81,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 + rt.prio = @rtprio_server@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/pipewire-aes67.conf.in b/src/daemon/pipewire-aes67.conf.in index d1986cf3b..34c432f65 100644 --- a/src/daemon/pipewire-aes67.conf.in +++ b/src/daemon/pipewire-aes67.conf.in @@ -52,7 +52,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/pipewire-avb.conf.in b/src/daemon/pipewire-avb.conf.in index 68f89ca4c..3752a4ec7 100644 --- a/src/daemon/pipewire-avb.conf.in +++ b/src/daemon/pipewire-avb.conf.in @@ -27,7 +27,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/pipewire-pulse.conf.in b/src/daemon/pipewire-pulse.conf.in index 776018f6a..1379ecf3c 100644 --- a/src/daemon/pipewire-pulse.conf.in +++ b/src/daemon/pipewire-pulse.conf.in @@ -27,8 +27,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 - rt.prio = 65 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 #uclamp.min = 0 diff --git a/src/daemon/pipewire-vulkan.conf.in b/src/daemon/pipewire-vulkan.conf.in index 5bad77c45..eae71d35c 100644 --- a/src/daemon/pipewire-vulkan.conf.in +++ b/src/daemon/pipewire-vulkan.conf.in @@ -53,7 +53,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 + #rt.prio = @rtprio_client@ #rt.time.soft = -1 #rt.time.hard = -1 } diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in index ebe8c1e93..76abe3fee 100644 --- a/src/daemon/pipewire.conf.in +++ b/src/daemon/pipewire.conf.in @@ -96,7 +96,7 @@ context.modules = [ { name = libpipewire-module-rt args = { nice.level = -11 - #rt.prio = 88 + rt.prio = @rtprio_server@ #rt.time.soft = -1 #rt.time.hard = -1 #uclamp.min = 0 diff --git a/src/modules/module-ffado-driver.c b/src/modules/module-ffado-driver.c index 61c11fb64..dc024d99f 100644 --- a/src/modules/module-ffado-driver.c +++ b/src/modules/module-ffado-driver.c @@ -115,6 +115,8 @@ PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME); #define DEFAULT_POSITION "[ FL FR ]" #define DEFAULT_MIDI_PORTS 1 +#define FFADO_RT_PRIORITY_PACKETIZER_RELATIVE 5 + #define MODULE_USAGE "( remote.name= ) " \ "( driver.mode= ) " \ "( ffado.devices= ) " \ @@ -762,7 +764,7 @@ static int open_ffado_device(struct impl *impl) impl->device_options.period_size = impl->period_size; impl->device_options.nb_buffers = impl->n_periods; impl->device_options.realtime = 1; - impl->device_options.packetizer_priority = 88; + impl->device_options.packetizer_priority = RTPRIO_SERVER + FFADO_RT_PRIORITY_PACKETIZER_RELATIVE; impl->device_options.verbose = impl->verbose; impl->device_options.slave_mode = impl->slave_mode; impl->device_options.snoop_mode = impl->snoop_mode; diff --git a/src/modules/module-rt.c b/src/modules/module-rt.c index 2182c894a..d9ff90201 100644 --- a/src/modules/module-rt.c +++ b/src/modules/module-rt.c @@ -136,7 +136,7 @@ PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME); #define DEFAULT_NICE_LEVEL 20 /* invalid value by default, see above */ #define DEFAULT_RT_PRIO_MIN 11 -#define DEFAULT_RT_PRIO 88 +#define DEFAULT_RT_PRIO RTPRIO_CLIENT #define DEFAULT_RT_TIME_SOFT -1 #define DEFAULT_RT_TIME_HARD -1