[PATCH] multipathd: make multipathd set priority to RLIMIT_RTPRIO

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



With this change, if the SCHED_RT_PRIO compiler flag is not set,
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.

Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx>
---
 Makefile.inc        |  7 +++++--
 README.md           |  2 +-
 multipathd/Makefile |  5 ++++-
 multipathd/main.c   | 28 +++++++++++++++++++++-------
 4 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/Makefile.inc b/Makefile.inc
index 6d206281..75935fd3 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -20,8 +20,11 @@ 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.
+# value. Set to 0 to stop multipathd from changing the scheduling policy and
+# priority it was started with. If undefined, 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.
 SCHED_RT_PRIO := 99
 
 EXTRAVERSION := $(shell rev=$$(git rev-parse --short=7 HEAD 2>/dev/null); echo $${rev:+-g$$rev})
diff --git a/README.md b/README.md
index bb41bf0e..fda3a086 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ The following variables can be passed to the `make` command line:
     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
+    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
diff --git a/multipathd/Makefile b/multipathd/Makefile
index 7300f07a..138d9562 100644
--- a/multipathd/Makefile
+++ b/multipathd/Makefile
@@ -21,6 +21,9 @@ CLI_LIBDEPS	:=  -L$(mpathutildir) -lmpathutil -L$(mpathcmddir) -lmpathcmd \
 LIBDEPS		:= -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \
 	  	-ldevmapper $(CLI_LIBDEPS)
 
+ifdef SCHED_RT_PRIO
+PR_CPPFLAGS	:= -DSCHED_RT_PRIO=$(SCHED_RT_PRIO)
+endif
 ifeq ($(READLINE),libedit)
 RL_CPPFLAGS	:= -DUSE_LIBEDIT
 RL_LIBDEPS	:= -ledit
@@ -58,7 +61,7 @@ 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 $@ $<
+	$(Q)$(CC) $(CPPFLAGS) $(PR_CPPFLAGS) $(CFLAGS) -c -o $@ $<
 
 install:
 	$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
diff --git a/multipathd/main.c b/multipathd/main.c
index 9486a8a3..1ca70c90 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -3171,14 +3171,29 @@ static void
 setscheduler (void)
 {
 	int res;
-	static struct sched_param sched_param = {
-		.sched_priority = SCHED_RT_PRIO
-	};
+	static struct sched_param sched_param;
+
+#ifdef SCHED_RT_PRIO
+	if (SCHED_RT_PRIO <= 0)
+		return;
+	sched_param.sched_priority = SCHED_RT_PRIO;
+#else
+	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;
+#endif
+	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 +3486,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)
-- 
2.43.0





[Index of Archives]     [DM Crypt]     [Fedora Desktop]     [ATA RAID]     [Fedora Marketing]     [Fedora Packaging]     [Fedora SELinux]     [Yosemite Discussion]     [KDE Users]     [Fedora Docs]

  Powered by Linux