X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fcgroup.c;h=9277dd69f6e42eb2d14a07fc49001e41a0def7df;hb=112a7f4696ebb96abdb42df62e1e794e903f66b3;hp=1c818ab300828989c54ea95981649ce351abe00f;hpb=0a1eb06d9aacc1f007be04c4133031e0acc91cdd;p=elogind.git diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 1c818ab30..9277dd69f 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -92,7 +92,7 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) { "%sBlockIOAccounting=%s\n" "%sMemoryAccounting=%s\n" "%sCPUShares=%lu\n" - "%sBlockIOWeight%lu\n" + "%sBlockIOWeight=%lu\n" "%sMemoryLimit=%" PRIu64 "\n" "%sMemorySoftLimit=%" PRIu64 "\n" "%sDevicePolicy=%s\n", @@ -114,7 +114,7 @@ void cgroup_context_dump(CGroupContext *c, FILE* f, const char *prefix) { LIST_FOREACH(device_weights, w, c->blockio_device_weights) fprintf(f, - "%sBlockIOWeight=%s %lu", + "%sBlockIODeviceWeight=%s %lu", prefix, w->path, w->weight); @@ -257,16 +257,23 @@ void cgroup_context_apply(CGroupContext *c, CGroupControllerMask mask, const cha if (mask & CGROUP_MEMORY) { char buf[DECIMAL_STR_MAX(uint64_t) + 1]; + if (c->memory_limit != (uint64_t) -1) { + sprintf(buf, "%" PRIu64 "\n", c->memory_limit); + r = cg_set_attribute("memory", path, "memory.limit_in_bytes", buf); + } else + r = cg_set_attribute("memory", path, "memory.limit_in_bytes", "-1"); - sprintf(buf, "%" PRIu64 "\n", c->memory_limit); - r = cg_set_attribute("memory", path, "memory.limit_in_bytes", buf); if (r < 0) log_error("Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r)); - sprintf(buf, "%" PRIu64 "\n", c->memory_soft_limit); - cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", buf); + if (c->memory_soft_limit != (uint64_t) -1) { + sprintf(buf, "%" PRIu64 "\n", c->memory_soft_limit); + r = cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", buf); + } else + r = cg_set_attribute("memory", path, "memory.soft_limit_in_bytes", "-1"); + if (r < 0) - log_error("Failed to set memory.limit_in_bytes on %s: %s", path, strerror(-r)); + log_error("Failed to set memory.soft_limit_in_bytes on %s: %s", path, strerror(-r)); } if (mask & CGROUP_DEVICE) { @@ -382,6 +389,7 @@ static CGroupControllerMask unit_get_siblings_mask(Unit *u) { static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { char *path = NULL; int r; + bool is_in_hash = false; assert(u); @@ -390,8 +398,14 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { return -ENOMEM; r = hashmap_put(u->manager->cgroup_unit, path, u); - if (r < 0) + if (r == 0) + is_in_hash = true; + + if (r < 0) { + log_error("cgroup %s exists already: %s", path, strerror(-r)); + free(path); return r; + } /* First, create our own group */ r = cg_create_with_mask(mask, path); @@ -405,9 +419,12 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { log_error("Failed to migrate cgroup %s: %s", path, strerror(-r)); } - /* And remember the new data */ - free(u->cgroup_path); - u->cgroup_path = path; + if (!is_in_hash) { + /* And remember the new data */ + free(u->cgroup_path); + u->cgroup_path = path; + } + u->cgroup_realized = true; u->cgroup_mask = mask; @@ -531,9 +548,9 @@ void unit_destroy_cgroup(Unit *u) { if (!u->cgroup_path) return; - r = cg_trim_with_mask(u->cgroup_mask, u->cgroup_path, true); + r = cg_trim_with_mask(u->cgroup_mask, u->cgroup_path, !unit_has_name(u, SPECIAL_ROOT_SLICE)); if (r < 0) - log_error("Failed to destroy cgroup %s: %s", u->cgroup_path, strerror(-r)); + log_debug("Failed to destroy cgroup %s: %s", u->cgroup_path, strerror(-r)); hashmap_remove(u->manager->cgroup_unit, u->cgroup_path); @@ -638,8 +655,11 @@ int manager_setup_cgroup(Manager *m) { } /* 4. Realize the system slice and put us in there */ - a = strappenda(m->cgroup_root, "/" SPECIAL_SYSTEM_SLICE); - r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, a, 0); + if (m->running_as == SYSTEMD_SYSTEM) { + a = strappenda(m->cgroup_root, "/" SPECIAL_SYSTEM_SLICE); + r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, a, 0); + } else + r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_root, 0); if (r < 0) { log_error("Failed to create root cgroup hierarchy: %s", strerror(-r)); return r; @@ -728,13 +748,16 @@ int manager_notify_cgroup_empty(Manager *m, const char *cgroup) { assert(m); assert(cgroup); - r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, cgroup, true); - if (r == 0) - return 0; - u = manager_get_unit_by_cgroup(m, cgroup); - if (u && UNIT_VTABLE(u)->notify_cgroup_empty) - UNIT_VTABLE(u)->notify_cgroup_empty(u); + if (u) { + r = cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, true); + if (r > 0) { + if (UNIT_VTABLE(u)->notify_cgroup_empty) + UNIT_VTABLE(u)->notify_cgroup_empty(u); + + unit_add_to_gc_queue(u); + } + } return 0; }