X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fcgroup.c;h=6a6c5049b39df1377b571baa2d9e51e0fe80c8b4;hb=175a3d25d0e8596d4ba0759aea3f89ee228e7d6d;hp=d10f205a2ff431f807aa756fba53047c982fa11d;hpb=ddca82aca08712a302cfabdbe59f73ee9ed3f73a;p=elogind.git diff --git a/src/core/cgroup.c b/src/core/cgroup.c index d10f205a2..6a6c5049b 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; } @@ -508,7 +509,7 @@ int unit_realize_cgroup(Unit *u) { * unit, we need to first create all parents, but there's more * actually: for the weight-based controllers we also need to * make sure that all our siblings (i.e. units that are in the - * same slice as we are) have cgroup too. Otherwise things + * same slice as we are) have cgroups, too. Otherwise things * would become very uneven as each of their processes would * get as much resources as all our group together. This call * will synchronously create the parent cgroups, but will @@ -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)); @@ -588,8 +589,8 @@ pid_t unit_search_main_pid(Unit *u) { int manager_setup_cgroup(Manager *m) { _cleanup_free_ char *path = NULL; + char *e; int r; - char *e, *a; assert(m); @@ -609,9 +610,13 @@ int manager_setup_cgroup(Manager *m) { return r; } - /* Already in /system.slice? If so, let's cut this off again */ + /* LEGACY: Already in /system.slice? If so, let's cut this + * off. This is to support live upgrades from older systemd + * versions where PID 1 was moved there. */ if (m->running_as == SYSTEMD_SYSTEM) { e = endswith(m->cgroup_root, "/" SPECIAL_SYSTEM_SLICE); + if (!e) + e = endswith(m->cgroup_root, "/system"); if (e) *e = 0; } @@ -642,12 +647,8 @@ int manager_setup_cgroup(Manager *m) { log_debug("Release agent already installed."); } - /* 4. Realize the system slice and put us in there */ - 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); + /* 4. Make sure we are in the root cgroup */ + 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; @@ -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; }