cgroup: drop "ignore_self" argument from cg_is_empty()
In all cases where the function (or cg_is_empty_recursive()) ignoring the calling process is actually wrong, as a process keeps a cgroup busy regardless if its the current one or another. Hence, let's simplify things and drop the "ignore_self" parameter.
This commit is contained in:
parent
e155a0aa04
commit
6f883237f1
|
@ -891,49 +891,42 @@ int cg_uninstall_release_agent(const char *controller) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cg_is_empty(const char *controller, const char *path, bool ignore_self) {
|
int cg_is_empty(const char *controller, const char *path) {
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
pid_t pid = 0, self_pid;
|
pid_t pid = 0;
|
||||||
bool found = false;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(path);
|
assert(path);
|
||||||
|
|
||||||
r = cg_enumerate_processes(controller, path, &f);
|
r = cg_enumerate_processes(controller, path, &f);
|
||||||
if (r < 0)
|
if (r == -ENOENT)
|
||||||
return r == -ENOENT ? 1 : r;
|
return 1;
|
||||||
|
|
||||||
self_pid = getpid();
|
|
||||||
|
|
||||||
while ((r = cg_read_pid(f, &pid)) > 0) {
|
|
||||||
|
|
||||||
if (ignore_self && pid == self_pid)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
return !found;
|
r = cg_read_pid(f, &pid);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return r == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_self) {
|
int cg_is_empty_recursive(const char *controller, const char *path) {
|
||||||
_cleanup_closedir_ DIR *d = NULL;
|
_cleanup_closedir_ DIR *d = NULL;
|
||||||
char *fn;
|
char *fn;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(path);
|
assert(path);
|
||||||
|
|
||||||
r = cg_is_empty(controller, path, ignore_self);
|
r = cg_is_empty(controller, path);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = cg_enumerate_subgroups(controller, path, &d);
|
r = cg_enumerate_subgroups(controller, path, &d);
|
||||||
|
if (r == -ENOENT)
|
||||||
|
return 1;
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r == -ENOENT ? 1 : r;
|
return r;
|
||||||
|
|
||||||
while ((r = cg_read_subgroup(d, &fn)) > 0) {
|
while ((r = cg_read_subgroup(d, &fn)) > 0) {
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
|
@ -943,7 +936,7 @@ int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_
|
||||||
if (!p)
|
if (!p)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
r = cg_is_empty_recursive(controller, p, ignore_self);
|
r = cg_is_empty_recursive(controller, p);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,8 +93,8 @@ int cg_set_task_access(const char *controller, const char *path, mode_t mode, ui
|
||||||
int cg_install_release_agent(const char *controller, const char *agent);
|
int cg_install_release_agent(const char *controller, const char *agent);
|
||||||
int cg_uninstall_release_agent(const char *controller);
|
int cg_uninstall_release_agent(const char *controller);
|
||||||
|
|
||||||
int cg_is_empty(const char *controller, const char *path, bool ignore_self);
|
int cg_is_empty(const char *controller, const char *path);
|
||||||
int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_self);
|
int cg_is_empty_recursive(const char *controller, const char *path);
|
||||||
|
|
||||||
int cg_get_root_path(char **path);
|
int cg_get_root_path(char **path);
|
||||||
|
|
||||||
|
|
|
@ -1030,7 +1030,7 @@ int manager_notify_cgroup_empty(Manager *m, const char *cgroup) {
|
||||||
if (!u)
|
if (!u)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, true);
|
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -396,7 +396,7 @@ static bool scope_check_gc(Unit *u) {
|
||||||
if (u->cgroup_path) {
|
if (u->cgroup_path) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, true);
|
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1269,7 +1269,7 @@ static int cgroup_good(Service *s) {
|
||||||
if (!UNIT(s)->cgroup_path)
|
if (!UNIT(s)->cgroup_path)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path, true);
|
r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, UNIT(s)->cgroup_path);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -263,7 +263,7 @@ static int show_unit_cgroup(sd_bus *bus, const char *interface, const char *unit
|
||||||
if (isempty(cgroup))
|
if (isempty(cgroup))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup, false) != 0 && leader <= 0)
|
if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup) != 0 && leader <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
c = columns();
|
c = columns();
|
||||||
|
|
|
@ -375,7 +375,7 @@ static int show_unit_cgroup(sd_bus *bus, const char *unit, pid_t leader) {
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return bus_log_parse_error(r);
|
return bus_log_parse_error(r);
|
||||||
|
|
||||||
if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup, false) != 0 && leader <= 0)
|
if (cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup) != 0 && leader <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
c = columns();
|
c = columns();
|
||||||
|
|
|
@ -152,7 +152,7 @@ int show_cgroup_by_path(const char *path, const char *prefix, unsigned n_columns
|
||||||
if (!k)
|
if (!k)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
if (!(flags & OUTPUT_SHOW_ALL) && cg_is_empty_recursive(NULL, k, false) > 0)
|
if (!(flags & OUTPUT_SHOW_ALL) && cg_is_empty_recursive(NULL, k) > 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!shown_pids) {
|
if (!shown_pids) {
|
||||||
|
|
|
@ -3557,7 +3557,7 @@ static void print_status_info(
|
||||||
|
|
||||||
if (i->control_group &&
|
if (i->control_group &&
|
||||||
(i->main_pid > 0 || i->control_pid > 0 ||
|
(i->main_pid > 0 || i->control_pid > 0 ||
|
||||||
((arg_transport != BUS_TRANSPORT_LOCAL && arg_transport != BUS_TRANSPORT_MACHINE) || cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, i->control_group, false) == 0))) {
|
((arg_transport != BUS_TRANSPORT_LOCAL && arg_transport != BUS_TRANSPORT_MACHINE) || cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, i->control_group) == 0))) {
|
||||||
unsigned c;
|
unsigned c;
|
||||||
|
|
||||||
printf(" CGroup: %s\n", i->control_group);
|
printf(" CGroup: %s\n", i->control_group);
|
||||||
|
|
|
@ -56,18 +56,18 @@ int main(int argc, char*argv[]) {
|
||||||
assert_se(path_equal(path, "/sys/fs/cgroup/systemd/test-b/test-d"));
|
assert_se(path_equal(path, "/sys/fs/cgroup/systemd/test-b/test-d"));
|
||||||
free(path);
|
free(path);
|
||||||
|
|
||||||
assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, "/test-a", false) > 0);
|
assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, "/test-a") > 0);
|
||||||
assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, "/test-b", false) > 0);
|
assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, "/test-b") > 0);
|
||||||
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", false) > 0);
|
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a") > 0);
|
||||||
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", false) == 0);
|
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b") == 0);
|
||||||
|
|
||||||
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", 0, false, false, false, NULL) == 0);
|
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", 0, false, false, false, NULL) == 0);
|
||||||
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", 0, false, false, false, NULL) > 0);
|
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", 0, false, false, false, NULL) > 0);
|
||||||
|
|
||||||
assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", SYSTEMD_CGROUP_CONTROLLER, "/test-a", false, false) > 0);
|
assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", SYSTEMD_CGROUP_CONTROLLER, "/test-a", false, false) > 0);
|
||||||
|
|
||||||
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", false) == 0);
|
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a") == 0);
|
||||||
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", false) > 0);
|
assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b") > 0);
|
||||||
|
|
||||||
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", 0, false, false, false, NULL) > 0);
|
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-a", 0, false, false, false, NULL) > 0);
|
||||||
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", 0, false, false, false, NULL) == 0);
|
assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, "/test-b", 0, false, false, false, NULL) == 0);
|
||||||
|
|
Loading…
Reference in New Issue