chiark / gitweb /
tree-wide: spelling fixes
[elogind.git] / src / core / cgroup.c
index af048354e1fa71d23fde70783150183bf45c69f3..35b862d5c2ff14d7bd6c84d8ecad0531a4ed8c8b 100644 (file)
@@ -605,23 +605,31 @@ 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);
 
-        path = unit_default_cgroup_path(u);
-        if (!path)
-                return log_oom();
+        c = unit_get_cgroup_context(u);
+        if (!c)
+                return 0;
 
-        r = hashmap_put(u->manager->cgroup_unit, path, u);
-        if (r < 0) {
-                log_error(r == -EEXIST ? "cgroup %s exists already: %s" : "hashmap_put failed for %s: %s", path, strerror(-r));
-                return r;
-        }
-        if (r > 0) {
-                u->cgroup_path = path;
-                path = NULL;
+        if (!u->cgroup_path) {
+                _cleanup_free_ char *path = NULL;
+
+                path = unit_default_cgroup_path(u);
+                if (!path)
+                        return log_oom();
+
+                r = hashmap_put(u->manager->cgroup_unit, path, u);
+                if (r < 0) {
+                        log_error(r == -EEXIST ? "cgroup %s exists already: %s" : "hashmap_put failed for %s: %s", path, strerror(-r));
+                        return r;
+                }
+                if (r > 0) {
+                        u->cgroup_path = path;
+                        path = NULL;
+                }
         }
 
         /* First, create our own group */
@@ -633,10 +641,30 @@ 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 (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;
+}
+
+int unit_attach_pids_to_cgroup(Unit *u) {
+        int r;
+        assert(u);
+
+        r = unit_realize_cgroup(u);
         if (r < 0)
-                log_warning_errno(r, "Failed to migrate cgroup from to %s: %m", u->cgroup_path);
+                return r;
+
+        r = cg_attach_many_everywhere(u->manager->cgroup_supported, u->cgroup_path, u->pids, migrate_callback, u);
+        if (r < 0)
+                return r;
 
         return 0;
 }
@@ -782,7 +810,7 @@ int unit_realize_cgroup(Unit *u) {
         return unit_realize_cgroup_now(u, manager_state(u->manager));
 }
 
-void unit_destroy_cgroup(Unit *u) {
+void unit_destroy_cgroup_if_empty(Unit *u) {
         int r;
 
         assert(u);
@@ -802,7 +830,6 @@ void unit_destroy_cgroup(Unit *u) {
         u->cgroup_path = NULL;
         u->cgroup_realized = false;
         u->cgroup_realized_mask = 0;
-
 }
 
 pid_t unit_search_main_pid(Unit *u) {