summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-09-23 21:56:05 -0500
committerLennart Poettering <lennart@poettering.net>2013-09-25 03:38:17 +0200
commit13b84ec7df103ce388910a2b868fe1668c1e27ef (patch)
tree773d34a85343a61b3368ef5a67a156ffcf14689a /src/core
parent8bd94f7a03032ac9218e88e8e099e974627a3bcb (diff)
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.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/cgroup.c8
-rw-r--r--src/core/execute.c4
-rw-r--r--src/core/mount.c2
-rw-r--r--src/core/scope.c2
-rw-r--r--src/core/service.c2
-rw-r--r--src/core/socket.c2
-rw-r--r--src/core/swap.c2
7 files changed, 11 insertions, 11 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index e66b8f4851..8bf4d896de 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -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));
diff --git a/src/core/execute.c b/src/core/execute.c
index f840642d14..0bfa41836a 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -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;
diff --git a/src/core/mount.c b/src/core/mount.c
index 5c18d4e463..78c5c1e6d6 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -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,
diff --git a/src/core/scope.c b/src/core/scope.c
index b94f3ff7ba..50e5dbacb4 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -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;
diff --git a/src/core/service.c b/src/core/service.c
index cc61b546fc..24b7bef287 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -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,
diff --git a/src/core/socket.c b/src/core/socket.c
index 46a73e0108..190b36c3ca 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -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,
diff --git a/src/core/swap.c b/src/core/swap.c
index 82bfad187e..dc6731ab30 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -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,