]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgroup-util: Properly handle conditions where cgroup.threads is empty after SIGKILL...
authormsizanoen1 <msizanoen@qtmlabs.xyz>
Mon, 30 May 2022 15:08:07 +0000 (22:08 +0700)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 30 May 2022 20:03:31 +0000 (05:03 +0900)
After sending a SIGKILL to a process, the process might disappear from
`cgroup.threads` but still show up in `cgroup.procs` and still remains in the
cgroup and cause migrating new processes to `Delegate=yes` cgroups to fail with
`-EBUSY`. This is especially likely for heavyweight processes that consume more
kernel CPU time to clean up.

Fix this by only returning 0 when both `cgroup.threads` and
`cgroup.procs` are empty.

src/basic/cgroup-util.c

index 95bf177a6bd2656a781e638dc51bb371dc651b20..b03cc70e2e6582a0c9cbbcc353ced1bb978ee60e 100644 (file)
@@ -357,20 +357,29 @@ int cg_kill(
                 Set *s,
                 cg_kill_log_func_t log_kill,
                 void *userdata) {
-        int r;
+
+        int r, ret;
 
         r = cg_kill_items(controller, path, sig, flags, s, log_kill, userdata, "cgroup.procs");
         if (r < 0 || sig != SIGKILL)
                 return r;
 
+        ret = r;
+
         /* Only in case of killing with SIGKILL and when using cgroupsv2, kill remaining threads manually as
            a workaround for kernel bug. It was fixed in 5.2-rc5 (c03cd7738a83), backported to 4.19.66
            (4340d175b898) and 4.14.138 (feb6b123b7dd). */
         r = cg_unified_controller(controller);
-        if (r <= 0)
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return ret;
+
+        r = cg_kill_items(controller, path, sig, flags, s, log_kill, userdata, "cgroup.threads");
+        if (r < 0)
                 return r;
 
-        return cg_kill_items(controller, path, sig, flags, s, log_kill, userdata, "cgroup.threads");
+        return r > 0 || ret > 0;
 }
 
 int cg_kill_kernel_sigkill(const char *controller, const char *path) {