From ca891be92be9f82078bd88d041098c34ae35334f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 10 Dec 2014 20:38:24 +0100 Subject: [PATCH] core: don't migrate PIDs for units that may contain subcgroups, do this only for leaf units Otherwise a slice or delegation unit might move PIDs around ignoring the fact that it is attached to a subcgroup. (cherry picked from commit 0cd385d31814c8c1bc0c81d11ef321036b8b0921) Resolves: #1179715 --- src/core/cgroup.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 764311f..5558b6d 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -392,11 +392,16 @@ static CGroupControllerMask unit_get_siblings_mask(Unit *u) { static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { _cleanup_free_ char *path; + CGroupContext *c; int r; bool was_in_hash = false; assert(u); + c = unit_get_cgroup_context(u); + if (!c) + return 0; + path = unit_default_cgroup_path(u); if (!path) return log_oom(); @@ -416,8 +421,10 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { if (r < 0) log_error("Failed to create cgroup %s: %s", path, strerror(-r)); - /* Then, possibly move things over */ - if (u->cgroup_path) { + /* Then, possibly move things over, but not if + * subgroups may contain processes, which is the case + * for slice and delegation units. */ + if (u->cgroup_path && u->type != UNIT_SLICE && !c->delegate) { r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, path); if (r < 0) log_error("Failed to migrate cgroup from %s to %s: %s",