diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-12-10 22:06:44 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-12-10 22:06:44 +0100 |
commit | 7b3fd6313c4b07b6f822a9f979d0c22350a401d9 (patch) | |
tree | 936f7fa948b9d5eb2e417204108353c13e6485a9 /src/core/cgroup.c | |
parent | 0cd385d31814c8c1bc0c81d11ef321036b8b0921 (diff) |
scope: make attachment of initial PIDs a bit more robust
Diffstat (limited to 'src/core/cgroup.c')
-rw-r--r-- | src/core/cgroup.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 83678e6e03..35b862d5c2 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -605,7 +605,6 @@ 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; @@ -615,18 +614,22 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { if (!c) return 0; - path = unit_default_cgroup_path(u); - if (!path) - return log_oom(); + if (!u->cgroup_path) { + _cleanup_free_ char *path = NULL; - 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; + 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 */ @@ -651,6 +654,21 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { return 0; } +int unit_attach_pids_to_cgroup(Unit *u) { + int r; + assert(u); + + r = unit_realize_cgroup(u); + if (r < 0) + 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; +} + static bool unit_has_mask_realized(Unit *u, CGroupControllerMask mask) { assert(u); |