mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-rt: add option to disable rlimits/portal/rtkit
This commit is contained in:
		
							parent
							
								
									a373d7fde4
								
							
						
					
					
						commit
						4137ff656a
					
				
					 1 changed files with 39 additions and 7 deletions
				
			
		| 
						 | 
					@ -63,7 +63,8 @@
 | 
				
			||||||
 * This requires `RLIMIT_RTPRIO` to be set to a value that's equal to this
 | 
					 * This requires `RLIMIT_RTPRIO` to be set to a value that's equal to this
 | 
				
			||||||
 * module's `rt.prio` parameter or higher. Most distros will come with some
 | 
					 * module's `rt.prio` parameter or higher. Most distros will come with some
 | 
				
			||||||
 * package that configures this for certain groups or users. If this is not set
 | 
					 * package that configures this for certain groups or users. If this is not set
 | 
				
			||||||
 * up and DBus is available, then this module will fall back to using RTKit.
 | 
					 * up and DBus is available, then this module will fall back to using the Portal
 | 
				
			||||||
 | 
					 * Realtime DBus API or RTKit.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * ## Module Options
 | 
					 * ## Module Options
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -75,6 +76,9 @@
 | 
				
			||||||
 *              consume without doing any blocking calls before the kernel kills
 | 
					 *              consume without doing any blocking calls before the kernel kills
 | 
				
			||||||
 *              the thread. This is a safety measure to avoid lockups of the complete
 | 
					 *              the thread. This is a safety measure to avoid lockups of the complete
 | 
				
			||||||
 *              system when some thread consumes 100%.
 | 
					 *              system when some thread consumes 100%.
 | 
				
			||||||
 | 
					 * - `rlimits.enabled`: enable the use of rtlimits, default true.
 | 
				
			||||||
 | 
					 * - `rtportal.enabled`: enable the use of realtime portal, default true
 | 
				
			||||||
 | 
					 * - `rtkit.enabled`: enable the use of rtkit, default true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 * The nice level is by default set to an invalid value so that clients don't
 | 
					 * The nice level is by default set to an invalid value so that clients don't
 | 
				
			||||||
 * automatically have the nice level raised.
 | 
					 * automatically have the nice level raised.
 | 
				
			||||||
| 
						 | 
					@ -91,6 +95,9 @@
 | 
				
			||||||
 *         #rt.prio      = 88
 | 
					 *         #rt.prio      = 88
 | 
				
			||||||
 *         #rt.time.soft = -1
 | 
					 *         #rt.time.soft = -1
 | 
				
			||||||
 *         #rt.time.hard = -1
 | 
					 *         #rt.time.hard = -1
 | 
				
			||||||
 | 
					 *         #rlimits.enabled = true
 | 
				
			||||||
 | 
					 *         #rtportal.enabled = true
 | 
				
			||||||
 | 
					 *         #rtkit.enabled = true
 | 
				
			||||||
 *     }
 | 
					 *     }
 | 
				
			||||||
 *     flags = [ ifexists nofail ]
 | 
					 *     flags = [ ifexists nofail ]
 | 
				
			||||||
 * }
 | 
					 * }
 | 
				
			||||||
| 
						 | 
					@ -123,8 +130,11 @@ PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MODULE_USAGE	"( nice.level=<priority: default "SPA_STRINGIFY(DEFAULT_NICE_LEVEL)"(don't change)> ) "	\
 | 
					#define MODULE_USAGE	"( nice.level=<priority: default "SPA_STRINGIFY(DEFAULT_NICE_LEVEL)"(don't change)> ) "	\
 | 
				
			||||||
			"( rt.prio=<priority: default "SPA_STRINGIFY(DEFAULT_RT_PRIO)"> ) "		\
 | 
								"( rt.prio=<priority: default "SPA_STRINGIFY(DEFAULT_RT_PRIO)"> ) "		\
 | 
				
			||||||
			"( rt.time.soft=<in usec: default "SPA_STRINGIFY(DEFAULT_RT_TIME_SOFT)" ) "	\
 | 
								"( rt.time.soft=<in usec: default "SPA_STRINGIFY(DEFAULT_RT_TIME_SOFT)"> ) "	\
 | 
				
			||||||
			"( rt.time.hard=<in usec: default "SPA_STRINGIFY(DEFAULT_RT_TIME_HARD)" ) "
 | 
								"( rt.time.hard=<in usec: default "SPA_STRINGIFY(DEFAULT_RT_TIME_HARD)"> ) "	\
 | 
				
			||||||
 | 
								"( rlimits.enabled=<default true> ) " \
 | 
				
			||||||
 | 
								"( rtportal.enabled=<default true> ) " \
 | 
				
			||||||
 | 
								"( rtkit.enabled=<default true> ) "
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const struct spa_dict_item module_props[] = {
 | 
					static const struct spa_dict_item module_props[] = {
 | 
				
			||||||
	{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
 | 
						{ PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
 | 
				
			||||||
| 
						 | 
					@ -170,6 +180,10 @@ struct impl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct spa_hook module_listener;
 | 
						struct spa_hook module_listener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unsigned rlimits_enabled:1;
 | 
				
			||||||
 | 
						unsigned rtportal_enabled:1;
 | 
				
			||||||
 | 
						unsigned rtkit_enabled:1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_DBUS
 | 
					#ifdef HAVE_DBUS
 | 
				
			||||||
	bool use_rtkit;
 | 
						bool use_rtkit;
 | 
				
			||||||
	/* For D-Bus. These are const static. */
 | 
						/* For D-Bus. These are const static. */
 | 
				
			||||||
| 
						 | 
					@ -568,6 +582,9 @@ static bool check_realtime_privileges(struct impl *impl)
 | 
				
			||||||
	struct sched_param new_sched_params;
 | 
						struct sched_param new_sched_params;
 | 
				
			||||||
	int try = 0;
 | 
						int try = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!impl->rlimits_enabled)
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (try++ < 2) {
 | 
						while (try++ < 2) {
 | 
				
			||||||
		/* We could check `RLIMIT_RTPRIO`, but the BSDs generally don't have
 | 
							/* We could check `RLIMIT_RTPRIO`, but the BSDs generally don't have
 | 
				
			||||||
		 * that available, and there are also other ways to use realtime
 | 
							 * that available, and there are also other ways to use realtime
 | 
				
			||||||
| 
						 | 
					@ -643,10 +660,15 @@ static int set_nice(struct impl *impl, int nice_level, bool warn)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res = pw_rtkit_make_high_priority(impl, 0, nice_level);
 | 
							res = pw_rtkit_make_high_priority(impl, 0, nice_level);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						else if (impl->rlimits_enabled)
 | 
				
			||||||
 | 
							res = sched_set_nice(nice_level);
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		res = sched_set_nice(nice_level);
 | 
							res = -ENOTSUP;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
						if (impl->rlimits_enabled)
 | 
				
			||||||
		res = sched_set_nice(nice_level);
 | 
							res = sched_set_nice(nice_level);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							res = -ENOTSUP;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (res < 0) {
 | 
						if (res < 0) {
 | 
				
			||||||
| 
						 | 
					@ -993,6 +1015,9 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
	impl->rt_prio = pw_properties_get_int32(props, "rt.prio", DEFAULT_RT_PRIO);
 | 
						impl->rt_prio = pw_properties_get_int32(props, "rt.prio", DEFAULT_RT_PRIO);
 | 
				
			||||||
	impl->rt_time_soft = pw_properties_get_int32(props, "rt.time.soft", DEFAULT_RT_TIME_SOFT);
 | 
						impl->rt_time_soft = pw_properties_get_int32(props, "rt.time.soft", DEFAULT_RT_TIME_SOFT);
 | 
				
			||||||
	impl->rt_time_hard = pw_properties_get_int32(props, "rt.time.hard", DEFAULT_RT_TIME_HARD);
 | 
						impl->rt_time_hard = pw_properties_get_int32(props, "rt.time.hard", DEFAULT_RT_TIME_HARD);
 | 
				
			||||||
 | 
						impl->rlimits_enabled = pw_properties_get_bool(props, "rlimits.enabled", true);
 | 
				
			||||||
 | 
						impl->rtportal_enabled = pw_properties_get_bool(props, "rtportal.enabled", true);
 | 
				
			||||||
 | 
						impl->rtkit_enabled = pw_properties_get_bool(props, "rtkit.enabled", true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool can_use_rtkit = false, use_rtkit = false;
 | 
						bool can_use_rtkit = false, use_rtkit = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1031,7 +1056,10 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
	impl->use_rtkit = use_rtkit;
 | 
						impl->use_rtkit = use_rtkit;
 | 
				
			||||||
	if (impl->use_rtkit) {
 | 
						if (impl->use_rtkit) {
 | 
				
			||||||
		/* Checking xdg-desktop-portal. It works fine in all situations. */
 | 
							/* Checking xdg-desktop-portal. It works fine in all situations. */
 | 
				
			||||||
 | 
							if (impl->rtportal_enabled)
 | 
				
			||||||
			impl->rtkit_bus = pw_rtkit_bus_get_session();
 | 
								impl->rtkit_bus = pw_rtkit_bus_get_session();
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								pw_log_info("Portal Realtime disabled");
 | 
				
			||||||
		if (impl->rtkit_bus != NULL) {
 | 
							if (impl->rtkit_bus != NULL) {
 | 
				
			||||||
			if (pw_rtkit_check_xdg_portal(impl->rtkit_bus)) {
 | 
								if (pw_rtkit_check_xdg_portal(impl->rtkit_bus)) {
 | 
				
			||||||
				impl->service_name = XDG_PORTAL_SERVICE_NAME;
 | 
									impl->service_name = XDG_PORTAL_SERVICE_NAME;
 | 
				
			||||||
| 
						 | 
					@ -1045,7 +1073,11 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		/* Failed to get xdg-desktop-portal, try to use rtkit. */
 | 
							/* Failed to get xdg-desktop-portal, try to use rtkit. */
 | 
				
			||||||
		if (impl->rtkit_bus == NULL) {
 | 
							if (impl->rtkit_bus == NULL) {
 | 
				
			||||||
 | 
								if (impl->rtkit_enabled)
 | 
				
			||||||
				impl->rtkit_bus = pw_rtkit_bus_get_system();
 | 
									impl->rtkit_bus = pw_rtkit_bus_get_system();
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									pw_log_info("RTkit disabled");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (impl->rtkit_bus != NULL) {
 | 
								if (impl->rtkit_bus != NULL) {
 | 
				
			||||||
				impl->service_name = RTKIT_SERVICE_NAME;
 | 
									impl->service_name = RTKIT_SERVICE_NAME;
 | 
				
			||||||
				impl->object_path = RTKIT_OBJECT_PATH;
 | 
									impl->object_path = RTKIT_OBJECT_PATH;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue