X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fcgroup.c;h=f0a97e6818263d039237dbdb691263048ff2dd07;hb=44b601bc79e46722bc0f0862ee0ce34a2284ef11;hp=d10f205a2ff431f807aa756fba53047c982fa11d;hpb=ddca82aca08712a302cfabdbe59f73ee9ed3f73a;p=elogind.git diff --git a/src/core/cgroup.c b/src/core/cgroup.c index d10f205a2..f0a97e681 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -41,7 +41,7 @@ void cgroup_context_free_device_allow(CGroupContext *c, CGroupDeviceAllow *a) { assert(c); assert(a); - LIST_REMOVE(CGroupDeviceAllow, device_allow, c->device_allow, a); + LIST_REMOVE(device_allow, c->device_allow, a); free(a->path); free(a); } @@ -50,7 +50,7 @@ void cgroup_context_free_blockio_device_weight(CGroupContext *c, CGroupBlockIODe assert(c); assert(w); - LIST_REMOVE(CGroupBlockIODeviceWeight, device_weights, c->blockio_device_weights, w); + LIST_REMOVE(device_weights, c->blockio_device_weights, w); free(w->path); free(w); } @@ -59,7 +59,7 @@ void cgroup_context_free_blockio_device_bandwidth(CGroupContext *c, CGroupBlockI assert(c); assert(b); - LIST_REMOVE(CGroupBlockIODeviceBandwidth, device_bandwidths, c->blockio_device_bandwidths, b); + LIST_REMOVE(device_bandwidths, c->blockio_device_bandwidths, b); free(b->path); free(b); } @@ -254,8 +254,9 @@ 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) { + char buf[DECIMAL_STR_MAX(uint64_t) + 1]; + sprintf(buf, "%" PRIu64 "\n", c->memory_limit); r = cg_set_attribute("memory", path, "memory.limit_in_bytes", buf); } else @@ -396,13 +397,13 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) { } /* First, create our own group */ - r = cg_create_with_mask(mask, path); + r = cg_create_everywhere(u->manager->cgroup_supported, mask, path); if (r < 0) log_error("Failed to create cgroup %s: %s", path, strerror(-r)); /* Then, possibly move things over */ - if (u->cgroup_path && !streq(path, u->cgroup_path)) { - r = cg_migrate_with_mask(mask, u->cgroup_path, path); + if (u->cgroup_path) { + r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, path); if (r < 0) log_error("Failed to migrate cgroup %s: %s", path, strerror(-r)); } @@ -425,7 +426,7 @@ static int unit_realize_cgroup_now(Unit *u) { assert(u); if (u->in_cgroup_queue) { - LIST_REMOVE(Unit, cgroup_queue, u->manager->cgroup_queue, u); + LIST_REMOVE(cgroup_queue, u->manager->cgroup_queue, u); u->in_cgroup_queue = false; } @@ -449,7 +450,7 @@ static void unit_add_to_cgroup_queue(Unit *u) { if (u->in_cgroup_queue) return; - LIST_PREPEND(Unit, cgroup_queue, u->manager->cgroup_queue, u); + LIST_PREPEND(cgroup_queue, u->manager->cgroup_queue, u); u->in_cgroup_queue = true; } @@ -536,7 +537,7 @@ void unit_destroy_cgroup(Unit *u) { if (!u->cgroup_path) return; - r = cg_trim_with_mask(u->cgroup_mask, u->cgroup_path, !unit_has_name(u, SPECIAL_ROOT_SLICE)); + r = cg_trim_everywhere(u->manager->cgroup_supported, u->cgroup_path, !unit_has_name(u, SPECIAL_ROOT_SLICE)); if (r < 0) log_debug("Failed to destroy cgroup %s: %s", u->cgroup_path, strerror(-r)); @@ -666,6 +667,9 @@ int manager_setup_cgroup(Manager *m) { /* 6. Figure out which controllers are supported */ m->cgroup_supported = cg_mask_supported(); + /* 7. Always enable hierarchial support if it exists... */ + cg_set_attribute("memory", "/", "memory.use_hierarchy", "1"); + return 0; }