X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fcgroup.c;h=35b862d5c2ff14d7bd6c84d8ecad0531a4ed8c8b;hb=821d4b6e068b2afaad94d43db22171c34a30400e;hp=6815ca907ac5a41f331771c9a39d603aaa158882;hpb=b1491eba40715438b0ac874f2be79d5622b971e1;p=elogind.git diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 6815ca907..35b862d5c 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -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; }