X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=cgroup.c;h=4ceaf382771a803e0a692c26f8d791bfb28ca3d0;hp=f5c2592ce8276a0760afd4f916435074c0404a74;hb=7ccfb64aa5dce4f71debf9b5c1f29b185f0c6f5e;hpb=6dde1f33e1249a8a6b354372dd95065f26b8c712 diff --git a/cgroup.c b/cgroup.c index f5c2592ce..4ceaf3827 100644 --- a/cgroup.c +++ b/cgroup.c @@ -118,17 +118,15 @@ void cgroup_bonding_free(CGroupBonding *b) { hashmap_remove(b->unit->meta.manager->cgroup_bondings, b->path); } - free(b->controller); - free(b->path); - if (b->cgroup) { - - if (b->only_us && b->clean_up) - cgroup_delete_cgroup(b->cgroup, true); + if (b->only_us && b->clean_up && cgroup_bonding_is_empty(b) > 0) + cgroup_delete_cgroup_ext(b->cgroup, true); cgroup_free(&b->cgroup); } + free(b->controller); + free(b->path); free(b); } @@ -416,6 +414,7 @@ int manager_setup_cgroup(Manager *m) { char *mp, *cp; int r; pid_t pid; + char suffix[32]; assert(m); @@ -438,12 +437,25 @@ int manager_setup_cgroup(Manager *m) { return translate_error(r, errno); } + snprintf(suffix, sizeof(suffix), "/systemd-%u", (unsigned) pid); + char_array_0(suffix); + free(m->cgroup_hierarchy); - m->cgroup_hierarchy = NULL; - if (asprintf(&m->cgroup_hierarchy, "%s/systemd-%llu", strcmp(cp, "/") == 0 ? "" : cp, (unsigned long long) pid) < 0) { + + if (endswith(cp, suffix)) + /* We probably got reexecuted and can continue to use our root cgroup */ + m->cgroup_hierarchy = cp; + else { + /* We need a new root cgroup */ + + m->cgroup_hierarchy = NULL; + r = asprintf(&m->cgroup_hierarchy, "%s%s", streq(cp, "/") ? "" : cp, suffix); free(cp); - free(mp); - return -ENOMEM; + + if (r < 0) { + free(mp); + return -ENOMEM; + } } log_info("Using cgroup controller <%s>, hierarchy mounted at <%s>, using root group <%s>.", @@ -457,7 +469,6 @@ int manager_setup_cgroup(Manager *m) { log_info("Installed release agent, or already installed."); free(mp); - free(cp); if ((r = create_hierarchy_cgroup(m)) < 0) log_error("Failed to create root cgroup hierarchy: %s", strerror(-r));