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().
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)
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)
}
}
-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;
// 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;
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;
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;
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);
/* 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");
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);
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)
}
_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");
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;
}
* 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;
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;
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;
/* 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",
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.");
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");
/* 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");
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;
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");
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;
/* 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;
}
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)
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);
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);
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 */