cgroup: if we do a cgroup operation then do something on all supported controllers
Previously we did operations like attach, trim or migrate only on the controllers that were enabled for a specific unit. With this changes we will now do them for all supproted controllers, and fall back to all possible prefix paths if the specified paths do not exist. This fixes issues if a controller is being disabled for a unit where it was previously enabled, and makes sure that all processes stay as "far down" the tree as groups exist.
This commit is contained in:
+4
-4
@@ -397,13 +397,13 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
|
||||
}
|
||||
|
||||
/* First, create our own group */
|
||||
r = cg_create_with_mask(mask, path);
|
||||
r = cg_create_everywhere(u->manager->cgroup_supported, mask, path);
|
||||
if (r < 0)
|
||||
log_error("Failed to create cgroup %s: %s", path, strerror(-r));
|
||||
|
||||
/* Then, possibly move things over */
|
||||
if (u->cgroup_path && !streq(path, u->cgroup_path)) {
|
||||
r = cg_migrate_with_mask(mask, u->cgroup_path, path);
|
||||
if (u->cgroup_path) {
|
||||
r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, path);
|
||||
if (r < 0)
|
||||
log_error("Failed to migrate cgroup %s: %s", path, strerror(-r));
|
||||
}
|
||||
@@ -537,7 +537,7 @@ void unit_destroy_cgroup(Unit *u) {
|
||||
if (!u->cgroup_path)
|
||||
return;
|
||||
|
||||
r = cg_trim_with_mask(u->cgroup_mask, u->cgroup_path, !unit_has_name(u, SPECIAL_ROOT_SLICE));
|
||||
r = cg_trim_everywhere(u->manager->cgroup_supported, u->cgroup_path, !unit_has_name(u, SPECIAL_ROOT_SLICE));
|
||||
if (r < 0)
|
||||
log_debug("Failed to destroy cgroup %s: %s", u->cgroup_path, strerror(-r));
|
||||
|
||||
|
||||
+2
-2
@@ -1017,7 +1017,7 @@ int exec_spawn(ExecCommand *command,
|
||||
bool apply_chroot,
|
||||
bool apply_tty_stdin,
|
||||
bool confirm_spawn,
|
||||
CGroupControllerMask cgroup_mask,
|
||||
CGroupControllerMask cgroup_supported,
|
||||
const char *cgroup_path,
|
||||
const char *unit_id,
|
||||
int idle_pipe[4],
|
||||
@@ -1198,7 +1198,7 @@ int exec_spawn(ExecCommand *command,
|
||||
}
|
||||
|
||||
if (cgroup_path) {
|
||||
err = cg_attach_with_mask(cgroup_mask, cgroup_path, 0);
|
||||
err = cg_attach_everywhere(cgroup_supported, cgroup_path, 0);
|
||||
if (err < 0) {
|
||||
r = EXIT_CGROUP;
|
||||
goto fail_child;
|
||||
|
||||
+1
-1
@@ -888,7 +888,7 @@ static int mount_spawn(Mount *m, ExecCommand *c, pid_t *_pid) {
|
||||
true,
|
||||
true,
|
||||
UNIT(m)->manager->confirm_spawn,
|
||||
UNIT(m)->cgroup_mask,
|
||||
UNIT(m)->manager->cgroup_supported,
|
||||
UNIT(m)->cgroup_path,
|
||||
UNIT(m)->id,
|
||||
NULL,
|
||||
|
||||
+1
-1
@@ -257,7 +257,7 @@ static int scope_start(Unit *u) {
|
||||
return r;
|
||||
}
|
||||
|
||||
r = cg_attach_many_with_mask(u->cgroup_mask, u->cgroup_path, s->pids);
|
||||
r = cg_attach_many_everywhere(u->manager->cgroup_supported, u->cgroup_path, s->pids);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
||||
+1
-1
@@ -1820,7 +1820,7 @@ static int service_spawn(
|
||||
apply_chroot,
|
||||
apply_tty_stdin,
|
||||
UNIT(s)->manager->confirm_spawn,
|
||||
UNIT(s)->cgroup_mask,
|
||||
UNIT(s)->manager->cgroup_supported,
|
||||
path,
|
||||
UNIT(s)->id,
|
||||
s->type == SERVICE_IDLE ? UNIT(s)->manager->idle_pipe : NULL,
|
||||
|
||||
+1
-1
@@ -1239,7 +1239,7 @@ static int socket_spawn(Socket *s, ExecCommand *c, pid_t *_pid) {
|
||||
true,
|
||||
true,
|
||||
UNIT(s)->manager->confirm_spawn,
|
||||
UNIT(s)->cgroup_mask,
|
||||
UNIT(s)->manager->cgroup_supported,
|
||||
UNIT(s)->cgroup_path,
|
||||
UNIT(s)->id,
|
||||
NULL,
|
||||
|
||||
+1
-1
@@ -625,7 +625,7 @@ static int swap_spawn(Swap *s, ExecCommand *c, pid_t *_pid) {
|
||||
true,
|
||||
true,
|
||||
UNIT(s)->manager->confirm_spawn,
|
||||
UNIT(s)->cgroup_mask,
|
||||
UNIT(s)->manager->cgroup_supported,
|
||||
UNIT(s)->cgroup_path,
|
||||
UNIT(s)->id,
|
||||
NULL,
|
||||
|
||||
Reference in New Issue
Block a user