dryang / rpms / systemd

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