From: Mike Yuan Date: Wed, 14 May 2025 20:23:09 +0000 (+0200) Subject: cgroup-util: drop cg_kill() cgroup.threads kludge X-Git-Tag: v258-rc1~603 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=68a2435cc22527189fdeb67d349857dc1423e43c;p=thirdparty%2Fsystemd.git cgroup-util: drop cg_kill() cgroup.threads kludge Our baseline is v5.4 now. --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 2cbfab8cff5..cd13b705195 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -109,14 +109,14 @@ int cg_get_cgroupid_at(int dfd, const char *path, uint64_t *ret) { return 0; } -static int cg_enumerate_items(const char *controller, const char *path, FILE **ret, const char *item) { +int cg_enumerate_processes(const char *controller, const char *path, FILE **ret) { _cleanup_free_ char *fs = NULL; FILE *f; int r; assert(ret); - r = cg_get_path(controller, path, item, &fs); + r = cg_get_path(controller, path, "cgroup.procs", &fs); if (r < 0) return r; @@ -128,10 +128,6 @@ static int cg_enumerate_items(const char *controller, const char *path, FILE **r return 0; } -int cg_enumerate_processes(const char *controller, const char *path, FILE **ret) { - return cg_enumerate_items(controller, path, ret, "cgroup.procs"); -} - int cg_read_pid(FILE *f, pid_t *ret, CGroupFlags flags) { unsigned long ul; @@ -186,11 +182,6 @@ int cg_read_pidref(FILE *f, PidRef *ret, CGroupFlags flags) { if (pid == 0) return -EREMOTE; - if (FLAGS_SET(flags, CGROUP_NO_PIDFD)) { - *ret = PIDREF_MAKE_FROM_PID(pid); - return 1; - } - r = pidref_set_pid(ret, pid); if (r >= 0) return 1; @@ -297,9 +288,8 @@ int cg_read_subgroup(DIR *d, char **ret) { return 0; } -static int cg_kill_items( +int cg_kill( const char *path, - const char *item, int sig, CGroupFlags flags, Set *s, @@ -310,7 +300,6 @@ static int cg_kill_items( int r, ret = 0; assert(path); - assert(item); assert(sig >= 0); /* Don't send SIGCONT twice. Also, SIGKILL always works even when process is suspended, hence @@ -336,7 +325,7 @@ static int cg_kill_items( done = true; - r = cg_enumerate_items(SYSTEMD_CGROUP_CONTROLLER, path, &f, item); + r = cg_enumerate_processes(SYSTEMD_CGROUP_CONTROLLER, path, &f); if (r == -ENOENT) break; if (r < 0) @@ -397,44 +386,6 @@ static int cg_kill_items( return ret; } -int cg_kill( - const char *path, - int sig, - CGroupFlags flags, - Set *s, - cg_kill_log_func_t log_kill, - void *userdata) { - - int r, ret; - - assert(path); - - ret = cg_kill_items(path, "cgroup.procs", sig, flags, s, log_kill, userdata); - if (ret < 0) - return log_debug_errno(ret, "Failed to kill processes in cgroup '%s' item cgroup.procs: %m", path); - if (sig != SIGKILL) - return ret; - - /* 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(SYSTEMD_CGROUP_CONTROLLER); - if (r < 0) - return r; - if (r == 0) - return ret; - - /* Opening pidfds for non thread group leaders only works from 6.9 onwards with PIDFD_THREAD. On - * older kernels or without PIDFD_THREAD pidfd_open() fails with EINVAL. Since we might read non - * thread group leader IDs from cgroup.threads, we set CGROUP_NO_PIDFD to avoid trying open pidfd's - * for them and instead use the regular pid. */ - r = cg_kill_items(path, "cgroup.threads", sig, flags|CGROUP_NO_PIDFD, s, log_kill, userdata); - if (r < 0) - return log_debug_errno(r, "Failed to kill processes in cgroup '%s' item cgroup.threads: %m", path); - - return r > 0 || ret > 0; -} - int cg_kill_recursive( const char *path, int sig, diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index 8434a094a0e..24da02022fe 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -197,7 +197,6 @@ typedef enum CGroupFlags { CGROUP_SIGCONT = 1 << 0, CGROUP_IGNORE_SELF = 1 << 1, CGROUP_DONT_SKIP_UNMAPPED = 1 << 2, - CGROUP_NO_PIDFD = 1 << 3, } CGroupFlags; int cg_enumerate_processes(const char *controller, const char *path, FILE **ret);