chiark / gitweb /
core: don't migrate PIDs for units that may contain subcgroups, do this only for...
authorLennart Poettering <lennart@poettering.net>
Wed, 10 Dec 2014 19:38:24 +0000 (20:38 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 10 Dec 2014 19:38:24 +0000 (20:38 +0100)
Otherwise a slice or delegation unit might move PIDs around ignoring the
fact that it is attached to a subcgroup.

src/core/cgroup.c

index 6815ca907ac5a41f331771c9a39d603aaa158882..83678e6e03c0cfcb627f9e7b4bdb808bbcf44164 100644 (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;
 
 static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
         _cleanup_free_ char *path = NULL;
+        CGroupContext *c;
         int r;
 
         assert(u);
 
         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();
         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;
 
         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;
 }
 
         return 0;
 }