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