All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Marzinski <bmarzins@redhat.com>
To: Christophe Varoqui <christophe.varoqui@opensvc.com>
Cc: device-mapper development <dm-devel@lists.linux.dev>,
	Martin Wilck <Martin.Wilck@suse.com>
Subject: [PATCH v2] multipathd: make multipathd set priority to RLIMIT_RTPRIO
Date: Tue,  9 Apr 2024 18:56:12 -0400	[thread overview]
Message-ID: <20240409225612.1837905-1-bmarzins@redhat.com> (raw)

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(-)

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
-- 
2.43.0


             reply	other threads:[~2024-04-09 22:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-09 22:56 Benjamin Marzinski [this message]
2024-04-10  8:37 ` [PATCH v2] multipathd: make multipathd set priority to RLIMIT_RTPRIO Martin Wilck
2024-04-10 14:30   ` Benjamin Marzinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240409225612.1837905-1-bmarzins@redhat.com \
    --to=bmarzins@redhat.com \
    --cc=Martin.Wilck@suse.com \
    --cc=christophe.varoqui@opensvc.com \
    --cc=dm-devel@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.