aboutsummaryrefslogtreecommitdiff
path: root/src/supervise-daemon
diff options
context:
space:
mode:
authorMatt Whitlock <gentoo@mattwhitlock.name>2022-08-21 09:55:04 -0400
committerWilliam Hubbs <w.d.hubbs@gmail.com>2022-09-06 17:26:22 -0500
commit112b69860f2cb6059c49404abbfb4e3f22603cfc (patch)
treedceb19713382e2e609e70fa4e4a24be2c814f91a /src/supervise-daemon
parentd21dde73ba175dd73192e60dc8060779fcbc1ec3 (diff)
start-stop-daemon, supervise-daemon: set autogroup nicelevel
As described in "Why nice levels are a placebo and have been for a very long time, and no one seems to have noticed"[1], the Linux kernel in its default configuration on many Linux distributions autogroups tasks by session ID and "fairly" allocates CPU time among such autogroups. The nice levels of tasks within each autogroup are only relative to other tasks within the same autogroup. Effectively, this means that the traditional nice level is rendered moot for tools like start-stop-daemon and supervise-daemon, which start each daemon in its own session and thus in its own autogroup. Linux does provide a means to change the niceness of autogroups relative to each other, so let's have start-stop- daemon and supervise-daemon make use of this feature where available so that -N,--nicelevel/SSD_NICELEVEL will actually do what the user intends. On systems where autogroups are not supported or are disabled, this commit introduces no change in behavior. Note that the setsid() call in the child process of start-stop-daemon is moved to much earlier. This is necessary so that the new process will be assigned to a new autogroup before the autogroup nicelevel is set. To avoid inadvertently acquiring /dev/tty as the controlling terminal of the new session after setsid() has given up the controlling terminal inherited from the parent process, tty_fd is opened before the call to setsid(). [1] https://www.reddit.com/r/linux/comments/d7hx2c/why_nice_levels_are_a_placebo_and_have_been_for_a/ This fixes #542.
Diffstat (limited to 'src/supervise-daemon')
-rw-r--r--src/supervise-daemon/supervise-daemon.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/supervise-daemon/supervise-daemon.c b/src/supervise-daemon/supervise-daemon.c
index 58946716..68490ad4 100644
--- a/src/supervise-daemon/supervise-daemon.c
+++ b/src/supervise-daemon/supervise-daemon.c
@@ -391,6 +391,14 @@ static void child_process(char *exec, char **argv)
if (setpriority(PRIO_PROCESS, getpid(), nicelevel) == -1)
eerrorx("%s: setpriority %d: %s", applet, nicelevel,
strerror(errno));
+ /* Open in "r+" mode to avoid creating if non-existent. */
+ fp = fopen("/proc/self/autogroup", "r+");
+ if (fp) {
+ fprintf(fp, "%d\n", nicelevel);
+ fclose(fp);
+ } else if (errno != ENOENT)
+ eerrorx("%s: autogroup nice %d: %s", applet,
+ nicelevel, strerror(errno));
}
if (ionicec != -1 && ioprio_set(1, getpid(), ionicec | ioniced) == -1)