]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgroup-util: drop cgroup v1 support from cg_pid_get_path()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 29 Aug 2025 21:32:56 +0000 (06:32 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 17 Nov 2025 12:30:29 +0000 (21:30 +0900)
We have dropped cgroup v1 support in v258. Let's drop legacy code.
Then, we can drop 'controller' argument from cg_pid_get_path() and
cg_pidref_get_path().

18 files changed:
src/basic/cgroup-util.c
src/basic/cgroup-util.h
src/core/cgroup.c
src/core/dbus-unit.c
src/coredump/coredump-send.c
src/libsystemd/sd-bus/bus-creds.c
src/libsystemd/sd-event/sd-event.c
src/libsystemd/sd-login/sd-login.c
src/machine/machined-dbus.c
src/network/networkd-sysctl.c
src/nspawn/nspawn-cgroup.c
src/shared/cgroup-show.c
src/shared/condition.c
src/shared/killall.c
src/shared/tests.c
src/test/test-cgroup-setup.c
src/test/test-cgroup-util.c
src/udev/udev-manager.c

index 572ea8c04877778a2e07ee05e3cd39572201a63c..a4e7c069b34f05a33a5d85ce56f5593890e266b3 100644 (file)
@@ -659,30 +659,14 @@ int cg_remove_xattr(const char *path, const char *name) {
         return RET_NERRNO(removexattr(fs, name));
 }
 
-int cg_pid_get_path(const char *controller, pid_t pid, char **ret_path) {
+int cg_pid_get_path(pid_t pid, char **ret_path) {
         _cleanup_fclose_ FILE *f = NULL;
-        const char *fs, *controller_str = NULL;  /* avoid false maybe-uninitialized warning */
-        int unified, r;
+        const char *fs;
+        int r;
 
         assert(pid >= 0);
         assert(ret_path);
 
-        if (controller) {
-                if (!cg_controller_is_valid(controller))
-                        return -EINVAL;
-        } else
-                controller = SYSTEMD_CGROUP_CONTROLLER;
-
-        unified = cg_unified_controller(controller);
-        if (unified < 0)
-                return unified;
-        if (unified == 0) {
-                if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
-                        controller_str = SYSTEMD_CGROUP_CONTROLLER_LEGACY;
-                else
-                        controller_str = controller;
-        }
-
         fs = procfs_file_alloca(pid, "cgroup");
         r = fopen_unlocked(fs, "re", &f);
         if (r == -ENOENT)
@@ -700,34 +684,13 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **ret_path) {
                 if (r == 0)
                         return -ENODATA;
 
-                if (unified) {
-                        e = startswith(line, "0:");
-                        if (!e)
-                                continue;
-
-                        e = strchr(e, ':');
-                        if (!e)
-                                continue;
-                } else {
-                        char *l;
-
-                        l = strchr(line, ':');
-                        if (!l)
-                                continue;
-
-                        l++;
-                        e = strchr(l, ':');
-                        if (!e)
-                                continue;
-                        *e = 0;
+                e = startswith(line, "0:");
+                if (!e)
+                        continue;
 
-                        assert(controller_str);
-                        r = string_contains_word(l, ",", controller_str);
-                        if (r < 0)
-                                return r;
-                        if (r == 0)
-                                continue;
-                }
+                e = strchr(e, ':');
+                if (!e)
+                        continue;
 
                 _cleanup_free_ char *path = strdup(e + 1);
                 if (!path)
@@ -747,7 +710,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **ret_path) {
         }
 }
 
-int cg_pidref_get_path(const char *controller, const PidRef *pidref, char **ret_path) {
+int cg_pidref_get_path(const PidRef *pidref, char **ret_path) {
         _cleanup_free_ char *path = NULL;
         int r;
 
@@ -762,7 +725,7 @@ int cg_pidref_get_path(const char *controller, const PidRef *pidref, char **ret_
         // bit of information from pidfd directly. However, the latter requires privilege and it's
         // not entirely clear how to handle cgroups from outer namespace.
 
-        r = cg_pid_get_path(controller, pidref->pid, &path);
+        r = cg_pid_get_path(pidref->pid, &path);
         if (r < 0)
                 return r;
 
@@ -880,7 +843,7 @@ int cg_get_root_path(char **ret_path) {
 
         assert(ret_path);
 
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 1, &p);
+        r = cg_pid_get_path(1, &p);
         if (r < 0)
                 return r;
 
@@ -922,7 +885,7 @@ int cg_pid_get_path_shifted(pid_t pid, const char *root, char **ret_cgroup) {
         assert(pid >= 0);
         assert(ret_cgroup);
 
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &raw);
+        r = cg_pid_get_path(pid, &raw);
         if (r < 0)
                 return r;
 
index 3731b8562736959c7042f660584b47b20f7dca95..6f36194403dba4e2dc17ad8cf1c7bdae6515d5ed 100644 (file)
@@ -174,8 +174,8 @@ int cg_mangle_path(const char *path, char **ret);
 int cg_get_path(const char *controller, const char *path, const char *suffix, char **ret);
 int cg_get_path_and_check(const char *controller, const char *path, const char *suffix, char **ret);
 
-int cg_pid_get_path(const char *controller, pid_t pid, char **ret);
-int cg_pidref_get_path(const char *controller, const PidRef *pidref, char **ret);
+int cg_pid_get_path(pid_t pid, char **ret);
+int cg_pidref_get_path(const PidRef *pidref, char **ret);
 
 int cg_is_threaded(const char *path);
 
index 5e8138726605b1775f25e2f320a37b8d94e05b16..7279682b63f503132b6138fc7d8b159a470fdf7e 100644 (file)
@@ -3260,7 +3260,7 @@ int manager_setup_cgroup(Manager *m) {
 
         /* 1. Determine hierarchy */
         m->cgroup_root = mfree(m->cgroup_root);
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &m->cgroup_root);
+        r = cg_pid_get_path(0, &m->cgroup_root);
         if (r < 0)
                 return log_error_errno(r, "Cannot determine cgroup we are running in: %m");
 
@@ -3404,7 +3404,7 @@ Unit* manager_get_unit_by_pidref_cgroup(Manager *m, const PidRef *pid) {
 
         assert(m);
 
-        if (cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup) < 0)
+        if (cg_pidref_get_path(pid, &cgroup) < 0)
                 return NULL;
 
         return manager_get_unit_by_cgroup(m, cgroup);
index 493315cf3b04ffcb25a843d8b84836546ac6f515..ed4646f75aa833e8c98e23255c2164ea99e6cdc7 100644 (file)
@@ -1345,7 +1345,7 @@ static int append_process(sd_bus_message *reply, const char *p, PidRef *pid, Set
                 return r;
 
         if (!p) {
-                r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &buf);
+                r = cg_pidref_get_path(pid, &buf);
                 if (r == -ESRCH)
                         return 0;
                 if (r < 0)
index 6316511baddf0d67baaab712c917852ded746b9c..eadec5f0f50855f96f031cdbf49c9fa488b15a7c 100644 (file)
@@ -132,7 +132,7 @@ static int can_forward_coredump(PidRef *pidref, PidRef *leader) {
         }
 
         _cleanup_free_ char *cgroup = NULL;
-        r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, leader, &cgroup);
+        r = cg_pidref_get_path(leader, &cgroup);
         if (r < 0)
                 return log_debug_errno(r, "Failed to get cgroup of the leader process, ignoring: %m");
 
index 86f1b70f952d9e8070de9a5f7179190a1b619245..2bbbd0f48440661cd8444cb07d119d1ff150f3d8 100644 (file)
@@ -1096,7 +1096,7 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, PidRef *pidref, pid_t tid
         if (missing & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_USER_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID)) {
 
                 if (!c->cgroup) {
-                        r = cg_pid_get_path(NULL, pidref->pid, &c->cgroup);
+                        r = cg_pid_get_path(pidref->pid, &c->cgroup);
                         if (r < 0 && !ERRNO_IS_NEG_PRIVILEGE(r))
                                 return r;
                 }
index 044cdf246d180e8e6784dbb763c62e4ea90e36bc..c9d14ebf17b760d4be3d980ac1d3f1c0022f444f 100644 (file)
@@ -1972,7 +1972,7 @@ _public_ int sd_event_add_memory_pressure(
                  * not delegated to us, or PSI simply not available in the kernel). */
 
                 _cleanup_free_ char *cg = NULL;
-                r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cg);
+                r = cg_pid_get_path(0, &cg);
                 if (r < 0)
                         return r;
 
index 133e97b432883c8afde10963c91bf00bfaa8e321..b559b4576b27638e886d0c4892cb33b3f7c5be04 100644 (file)
@@ -105,7 +105,7 @@ _public_ int sd_pid_get_cgroup(pid_t pid, char **ret_cgroup) {
         assert_return(pid >= 0, -EINVAL);
 
         _cleanup_free_ char *c = NULL;
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &c);
+        r = cg_pid_get_path(pid, &c);
         if (r < 0)
                 return r;
 
@@ -418,7 +418,7 @@ _public_ int sd_peer_get_cgroup(int fd, char **ret_cgroup) {
                 return r;
 
         _cleanup_free_ char *c = NULL;
-        r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, &pidref, &c);
+        r = cg_pidref_get_path(&pidref, &c);
         if (r < 0)
                 return r;
 
index 1619d3fd6b8c9584227f4b2451f2c48ba7990ac5..0f1ac1776ada07faac793532f0386055f2bc82af 100644 (file)
@@ -722,7 +722,7 @@ static int method_register_machine(sd_bus_message *message, void *userdata, sd_b
                 /* If this is not a top-level cgroup, then we need the cgroup path to be able to watch when
                  * it empties */
 
-                r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, &m->leader, &m->cgroup);
+                r = cg_pidref_get_path(&m->leader, &m->cgroup);
                 if (r < 0) {
                         r = sd_bus_error_set_errnof(error, r,
                                                     "Failed to determine cgroup of process "PID_FMT" : %m",
index 9a493357509cf2a2fc934888f0f692e0960b5b94..81316588291ea4078e7fec0a205e821bdec0813b 100644 (file)
@@ -109,7 +109,7 @@ int manager_install_sysctl_monitor(Manager *manager) {
         if (r < 0)
                 return log_warning_errno(r, "Failed to load libbpf, not installing sysctl monitor: %m");
 
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
+        r = cg_pid_get_path(0, &cgroup);
         if (r < 0)
                 return log_warning_errno(r, "Failed to get cgroup path, ignoring: %m.");
 
index de58ffb6a0031b5ae87ee6a20176683da5cf22be..caa55186efcc1e1de0f0a7d09edec4f8b2d0c02c 100644 (file)
@@ -75,9 +75,9 @@ int create_subcgroup(
                 return log_error_errno(r, "Failed to determine supported controllers: %m");
 
         if (keep_unit)
-                r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
+                r = cg_pid_get_path(0, &cgroup);
         else
-                r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
+                r = cg_pidref_get_path(pid, &cgroup);
         if (r < 0)
                 return log_error_errno(r, "Failed to get our control group: %m");
 
@@ -172,7 +172,7 @@ int bind_mount_cgroup_hierarchy(void) {
 
         /* NB: This must be called from the inner child, with /sys/fs/cgroup/ being a bind mount in mountns! */
 
-        r = cg_pid_get_path(NULL, 0, &own_cgroup_path);
+        r = cg_pid_get_path(0, &own_cgroup_path);
         if (r < 0)
                 return log_error_errno(r, "Failed to determine our own cgroup path: %m");
 
index e60cfec854f030e2ccf9919edd323302d080e421..ea419fd5d019ea6ad211130b2e737d0dc6b2fd77 100644 (file)
@@ -349,7 +349,7 @@ static int show_extra_pids(
         for (i = 0, j = 0; i < n_pids; i++) {
                 _cleanup_free_ char *k = NULL;
 
-                r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pids[i], &k);
+                r = cg_pid_get_path(pids[i], &k);
                 if (r < 0)
                         return r;
 
index b09eff1bfbfab831f3d93863dd9bac1b80f456df..a998c049cceddcfa8c74b285451f4526e36d878f 100644 (file)
@@ -1091,7 +1091,7 @@ static int condition_test_psi(Condition *c, char **env) {
                         return log_debug_errno(r, "Cannot determine slice \"%s\" cgroup path: %m", slice);
 
                 /* We might be running under the user manager, so get the root path and prefix it accordingly. */
-                r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &root_scope);
+                r = cg_pid_get_path(getpid_cached(), &root_scope);
                 if (r < 0)
                         return log_debug_errno(r, "Failed to get root cgroup path: %m");
 
index 0a41d251ef603d4e5f43d22f182e23ccccea5a4a..729e0e248050542e4209198d4d2088300a3a04b3 100644 (file)
@@ -53,7 +53,7 @@ static bool is_in_survivor_cgroup(const PidRef *pid) {
 
         assert(pidref_is_set(pid));
 
-        r = cg_pidref_get_path(/* controller= */ NULL, pid, &cgroup_path);
+        r = cg_pidref_get_path(pid, &cgroup_path);
         if (r == -EUNATCH) {
                 log_warning_errno(r, "Process " PID_FMT " appears to originate in foreign namespace, ignoring.", pid->pid);
                 return true;
index eed6ea62493ef77a5d3d9b258a7a8528bdae0ff4..53dda342a467f47ed9d692ee61aa43633ac260aa 100644 (file)
@@ -213,7 +213,7 @@ static int allocate_scope(void) {
 
         /* Let's try to run this test in a scope of its own, with delegation turned on, so that PID 1 doesn't
          * interfere with our cgroup management. */
-        if (cg_pid_get_path(NULL, 0, &cgroup_root) >= 0 && cg_is_delegated(cgroup_root) && stderr_is_journal()) {
+        if (cg_pid_get_path(0, &cgroup_root) >= 0 && cg_is_delegated(cgroup_root) && stderr_is_journal()) {
                 log_debug("Already running as a unit with delegated cgroup, not allocating a cgroup subroot.");
                 return 0;
         }
@@ -297,9 +297,9 @@ static int enter_cgroup(char **ret_cgroup, bool enter_subroot) {
         if (r < 0)
                 log_warning_errno(r, "Couldn't allocate a scope unit for this test, proceeding without.");
 
-        r = cg_pid_get_path(NULL, 0, &cgroup_root);
+        r = cg_pid_get_path(0, &cgroup_root);
         if (IN_SET(r, -ENOMEDIUM, -ENOENT))
-                return log_warning_errno(r, "cg_pid_get_path(NULL, 0, ...) failed: %m");
+                return log_warning_errno(r, "cg_pid_get_path(0, ...) failed: %m");
         ASSERT_OK(r);
 
         if (enter_subroot)
index 9f0cee9224eb640741da96f1c23a683c7642ce0e..195677bf0e017b0003da068267951c98476288db 100644 (file)
@@ -38,19 +38,19 @@ TEST(cg_create) {
         ASSERT_OK_EQ(cg_create(test_c), 1);
         ASSERT_OK_ZERO(cg_create_and_attach(test_b, 0));
 
-        ASSERT_OK_ZERO(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path));
+        ASSERT_OK_ZERO(cg_pid_get_path(getpid_cached(), &path));
         ASSERT_STREQ(path, test_b);
         free(path);
 
         ASSERT_OK_ZERO(cg_attach(test_a, 0));
 
-        ASSERT_OK_ZERO(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path));
+        ASSERT_OK_ZERO(cg_pid_get_path(getpid_cached(), &path));
         ASSERT_TRUE(path_equal(path, test_a));
         free(path);
 
         ASSERT_OK_EQ(cg_create_and_attach(test_d, 0), 1);
 
-        ASSERT_OK_ZERO(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path));
+        ASSERT_OK_ZERO(cg_pid_get_path(getpid_cached(), &path));
         ASSERT_TRUE(path_equal(path, test_d));
         free(path);
 
index 839bf412dd42cd1c3ddbf0c1187d2e4c00eb753d..6f84f9300b319c162cb6806bbb30137d5b88c102 100644 (file)
@@ -252,7 +252,7 @@ TEST(proc, .sd_booted = true) {
                 if (pidref_is_kernel_thread(&pid) != 0)
                         continue;
 
-                r = cg_pidref_get_path(SYSTEMD_CGROUP_CONTROLLER, &pid, &path);
+                r = cg_pidref_get_path(&pid, &path);
                 if (r == -ESRCH)
                         continue;
                 ASSERT_OK(r);
index a7118055d13afa258442ec12a6d13cd14102ad6e..0dac43a3fba9c1f938d885ae3e0f4874a4afe755 100644 (file)
@@ -1452,7 +1452,7 @@ int manager_main(Manager *manager) {
         assert(manager);
 
         _cleanup_free_ char *cgroup = NULL;
-        r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &cgroup);
+        r = cg_pid_get_path(0, &cgroup);
         if (r < 0)
                 log_debug_errno(r, "Failed to get cgroup, ignoring: %m");
         else if (endswith(cgroup, "/udev")) { /* If we are in a subcgroup /udev/ we assume it was delegated to us */