diff mbox series

[v2] multipathd: make multipathd set priority to RLIMIT_RTPRIO

Message ID 20240409225612.1837905-1-bmarzins@redhat.com (mailing list archive)
State Not Applicable, archived
Delegated to: christophe varoqui
Headers show
Series [v2] multipathd: make multipathd set priority to RLIMIT_RTPRIO | expand

Commit Message

Benjamin Marzinski April 9, 2024, 10:56 p.m. UTC
With this change, if the SCHED_RT_PRIO compiler flag has been removed.
Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look at
the hard limit. It it's 0, multipath will do nothing. Otherwise it will
change its scheduling policy to SCHED_RR and its priority to the hard
limit.

This allows users to change the priority of that multipathd runs with by
adding

LimitRTPRIO=<prio>

to the [Service] section of the multipathd.service unit file. Setting
LimitRTPRIO=0 will make multipathd run as a normal process, while
setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR prio,
which is 99.

To keep the existing behavior, multipathd.service now sets
LimitRTPRIO=infinity

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---

Notes:
    v2: Removed SCHED_RT_PRIO compiler flag at Martin Wilck's suggestion.
        Added LimitRTPRIO=infinity to multipathd.service

 Makefile.inc                     |  6 ------
 README.md                        |  3 ---
 multipathd/Makefile              |  3 ---
 multipathd/main.c                | 22 +++++++++++++++-------
 multipathd/multipathd.service.in |  1 +
 5 files changed, 16 insertions(+), 19 deletions(-)

Comments

Martin Wilck April 10, 2024, 8:37 a.m. UTC | #1
On Tue, 2024-04-09 at 18:56 -0400, Benjamin Marzinski wrote:
> With this change, if the SCHED_RT_PRIO compiler flag has been
> removed.
> Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look
> at
> the hard limit. It it's 0, multipath will do nothing. Otherwise it
> will
> change its scheduling policy to SCHED_RR and its priority to the hard
> limit.
> 
> This allows users to change the priority of that multipathd runs with
> by
> adding
> 
> LimitRTPRIO=<prio>
> 
> to the [Service] section of the multipathd.service unit file. Setting
> LimitRTPRIO=0 will make multipathd run as a normal process, while
> setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR
> prio,
> which is 99.
> 
> To keep the existing behavior, multipathd.service now sets
> LimitRTPRIO=infinity
> 
> Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>

Reviewed-by: Martin Wilck <mwilck@suse.com>

I will wait a while for feedback on 
https://github.com/opensvc/multipath-tools/issues/82
before pushing it to the queue branch.

When it's pushed, I'll squash it with 1c4301a ("multipathd: make
multipathd scheduling configurable"), if you don't mind.

Thanks,
Martin
Benjamin Marzinski April 10, 2024, 2:30 p.m. UTC | #2
On Wed, Apr 10, 2024 at 10:37:38AM +0200, Martin Wilck wrote:
> On Tue, 2024-04-09 at 18:56 -0400, Benjamin Marzinski wrote:
> > With this change, if the SCHED_RT_PRIO compiler flag has been
> > removed.
> > Instead multipathd will call getrlimit(RLIMIT_RTPRIO, ...) and look
> > at
> > the hard limit. It it's 0, multipath will do nothing. Otherwise it
> > will
> > change its scheduling policy to SCHED_RR and its priority to the hard
> > limit.
> > 
> > This allows users to change the priority of that multipathd runs with
> > by
> > adding
> > 
> > LimitRTPRIO=<prio>
> > 
> > to the [Service] section of the multipathd.service unit file. Setting
> > LimitRTPRIO=0 will make multipathd run as a normal process, while
> > setting LimitRTPRIO=infinity will make it use the maximum SCHED_RR
> > prio,
> > which is 99.
> > 
> > To keep the existing behavior, multipathd.service now sets
> > LimitRTPRIO=infinity
> > 
> > Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> 
> Reviewed-by: Martin Wilck <mwilck@suse.com>
> 
> I will wait a while for feedback on 
> https://github.com/opensvc/multipath-tools/issues/82
> before pushing it to the queue branch.
> 
> When it's pushed, I'll squash it with 1c4301a ("multipathd: make
> multipathd scheduling configurable"), if you don't mind.

That's fine.

> 
> Thanks,
> Martin
diff mbox series

Patch

diff --git a/Makefile.inc b/Makefile.inc
index 6d206281..5668e638 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -18,12 +18,6 @@  READLINE :=
 # SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
 SCSI_DH_MODULES_PRELOAD :=
 
-# Multipathd scheduling priority. Set value from 1 to 99 to make multipathd
-# change its scheduling policy to SCHED_RR and its priority to the specified
-# value. set to 0 to stop multipathd from changing the scheduling policy and
-# priority it was started with.
-SCHED_RT_PRIO := 99
-
 EXTRAVERSION := $(shell rev=$$(git rev-parse --short=7 HEAD 2>/dev/null); echo $${rev:+-g$$rev})
 
 # PKG_CONFIG must be read from the environment to enable compilation
diff --git a/README.md b/README.md
index bb41bf0e..d4f35f57 100644
--- a/README.md
+++ b/README.md
@@ -98,9 +98,6 @@  The following variables can be passed to the `make` command line:
     By default, command line editing is disabled.
     Note that using libreadline may
     [make binary indistributable due to license incompatibility](https://github.com/opensvc/multipath-tools/issues/36).
- * `SCHED_RT_PRIO={0-99}`: for values {1-99} set the realtime priority
-    multipathd will attempt to run with. for value 0, disable multipathd
-    changing itself to a realtime process.
  * `ENABLE_LIBDMMP=0`: disable building libdmmp
  * `ENABLE_DMEVENTS_POLL=0`: disable support for the device-mapper event
    polling API. For use with pre-5.0 kernels that don't support dmevent polling
diff --git a/multipathd/Makefile b/multipathd/Makefile
index 7300f07a..997b40cf 100644
--- a/multipathd/Makefile
+++ b/multipathd/Makefile
@@ -57,9 +57,6 @@  $(CLI):  $(CLI_OBJS)
 cli_handlers.o:	cli_handlers.c
 	$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -Wno-unused-parameter -c -o $@ $<
 
-main.o:	main.c
-	$(Q)$(CC) $(CPPFLAGS) -DSCHED_RT_PRIO=$(SCHED_RT_PRIO) $(CFLAGS) -c -o $@ $<
-
 install:
 	$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
 	$(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
diff --git a/multipathd/main.c b/multipathd/main.c
index 9486a8a3..dd17d5c3 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -3171,14 +3171,23 @@  static void
 setscheduler (void)
 {
 	int res;
-	static struct sched_param sched_param = {
-		.sched_priority = SCHED_RT_PRIO
-	};
+	static struct sched_param sched_param;
+	struct rlimit rlim;
+
+	if (getrlimit(RLIMIT_RTPRIO, &rlim) < 0 || rlim.rlim_max == 0)
+		return;
+
+	sched_param.sched_priority = rlim.rlim_max > INT_MAX ? INT_MAX :
+				     rlim.rlim_max;
+	res = sched_get_priority_max(SCHED_RR);
+	if (res > 0 && res < sched_param.sched_priority)
+		sched_param.sched_priority = res;
 
-	res = sched_setscheduler (0, SCHED_RR, &sched_param);
+	res = sched_setscheduler(0, SCHED_RR, &sched_param);
 
 	if (res == -1)
-		condlog(2, "Could not set SCHED_RR at priority 99");
+		condlog(2, "Could not set SCHED_RR at priority %d",
+			sched_param.sched_priority);
 	return;
 }
 
@@ -3471,8 +3480,7 @@  child (__attribute__((unused)) void *param)
 	if (!vecs)
 		goto failed;
 
-	if (SCHED_RT_PRIO)
-		setscheduler();
+	setscheduler();
 	set_oom_adj();
 #ifdef FPIN_EVENT_HANDLER
 	if (conf->marginal_pathgroups == MARGINAL_PATHGROUP_FPIN)
diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in
index 6d03ff71..18bb367e 100644
--- a/multipathd/multipathd.service.in
+++ b/multipathd/multipathd.service.in
@@ -19,6 +19,7 @@  NotifyAccess=main
 ExecStart=/sbin/multipathd -d -s
 ExecReload=/sbin/multipathd reconfigure
 TasksMax=infinity
+LimitRTPRIO=infinity
 
 [Install]
 WantedBy=sysinit.target