X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcgroup.c;h=291db4e6c9cf5682ddaf0bc81d2eba278346705a;hb=4cd1fbcc0648a289e9bf9d9047621bbdf7ec0ece;hp=301fc949dada5c8fa590ee90723cc7b7716ba9a3;hpb=e99e38bbdcca3fe5956823bdb3d38544ccf93221;p=elogind.git diff --git a/src/cgroup.c b/src/cgroup.c index 301fc949d..291db4e6c 100644 --- a/src/cgroup.c +++ b/src/cgroup.c @@ -70,12 +70,7 @@ int cgroup_bonding_realize(CGroupBonding *b) { goto fail; } - if (b->inherit) - r = cgroup_create_cgroup_from_parent(b->cgroup, true); - else - r = cgroup_create_cgroup(b->cgroup, true); - - if (r != 0) { + if ((r = cgroup_create_cgroup(b->cgroup, true)) != 0) { r = translate_error(r, errno); goto fail; } @@ -194,7 +189,10 @@ int cgroup_bonding_kill(CGroupBonding *b, int sig) { r = 0; goto kill_done; } else { - r = translate_error(r, errno); + if (r == ECGOTHER && errno == ENOENT) + r = ESRCH; + else + r = translate_error(r, errno); break; } } @@ -409,7 +407,7 @@ finish: } int manager_setup_cgroup(Manager *m) { - char *mp, *cp; + char *cp; int r; pid_t pid; char suffix[32]; @@ -422,18 +420,18 @@ int manager_setup_cgroup(Manager *m) { } free(m->cgroup_controller); - if (!(m->cgroup_controller = strdup("debug"))) + if (!(m->cgroup_controller = strdup("name=systemd"))) return -ENOMEM; - if ((r = cgroup_get_subsys_mount_point(m->cgroup_controller, &mp))) + free(m->cgroup_mount_point); + m->cgroup_mount_point = NULL; + if ((r = cgroup_get_subsys_mount_point(m->cgroup_controller, &m->cgroup_mount_point))) return translate_error(r, errno); pid = getpid(); - if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &cp))) { - free(mp); + if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &cp))) return translate_error(r, errno); - } snprintf(suffix, sizeof(suffix), "/systemd-%u", (unsigned) pid); char_array_0(suffix); @@ -450,24 +448,20 @@ int manager_setup_cgroup(Manager *m) { r = asprintf(&m->cgroup_hierarchy, "%s%s", streq(cp, "/") ? "" : cp, suffix); free(cp); - if (r < 0) { - free(mp); + if (r < 0) return -ENOMEM; - } } log_debug("Using cgroup controller <%s>, hierarchy mounted at <%s>, using root group <%s>.", m->cgroup_controller, - mp, + m->cgroup_mount_point, m->cgroup_hierarchy); - if ((r = install_release_agent(m, mp)) < 0) + if ((r = install_release_agent(m, m->cgroup_mount_point)) < 0) log_warning("Failed to install release agent, ignoring: %s", strerror(-r)); else log_debug("Installed release agent, or already installed."); - free(mp); - if ((r = create_hierarchy_cgroup(m)) < 0) log_error("Failed to create root cgroup hierarchy: %s", strerror(-r)); else @@ -537,6 +531,37 @@ int cgroup_notify_empty(Manager *m, const char *group) { return 0; } +Unit* cgroup_unit_by_pid(Manager *m, pid_t pid) { + CGroupBonding *l, *b; + char *group = NULL; + int r; + + assert(m); + + if (pid <= 1) + return NULL; + + if ((r = cgroup_get_current_controller_path(pid, m->cgroup_controller, &group))) + return NULL; + + l = hashmap_get(m->cgroup_bondings, group); + free(group); + + if (!l) + return NULL; + + LIST_FOREACH(by_path, b, l) { + + if (!b->unit) + continue; + + if (b->only_us) + return b->unit; + } + + return NULL; +} + CGroupBonding *cgroup_bonding_find_list(CGroupBonding *first, const char *controller) { CGroupBonding *b;