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.
This commit is contained in:
Lennart Poettering 2014-12-10 20:38:24 +01:00
parent d092879149
commit 0cd385d318

View file

@ -606,10 +606,15 @@ static const char *migrate_callback(CGroupControllerMask mask, void *userdata) {
static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
_cleanup_free_ char *path = NULL;
CGroupContext *c;
int r;
assert(u);
c = unit_get_cgroup_context(u);
if (!c)
return 0;
path = unit_default_cgroup_path(u);
if (!path)
return log_oom();
@ -633,10 +638,15 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
u->cgroup_realized = true;
u->cgroup_realized_mask = mask;
/* Then, possibly move things over */
r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, u->cgroup_path, migrate_callback, u);
if (r < 0)
log_warning_errno(r, "Failed to migrate cgroup from to %s: %m", u->cgroup_path);
if (u->type != UNIT_SLICE && !c->delegate) {
/* Then, possibly move things over, but not if
* subgroups may contain processes, which is the case
* for slice and delegation units. */
r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, u->cgroup_path, migrate_callback, u);
if (r < 0)
log_warning_errno(r, "Failed to migrate cgroup from to %s: %m", u->cgroup_path);
}
return 0;
}