diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-04-16 04:36:06 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-04-16 04:41:21 +0200 |
commit | 7027ff61a34a12487712b382a061c654acc3a679 (patch) | |
tree | 05e9374a566d6accdd962dd4dc6d7076b9304122 /src/core | |
parent | cec4ead904978b07db2154c618eeb48d3102da66 (diff) |
nspawn: introduce the new /machine/ tree in the cgroup tree and move containers there
Containers will now carry a label (normally derived from the root
directory name, but configurable by the user), and the container's root
cgroup is /machine/<label>. This label is called "machine name", and can
cover both containers and VMs (as soon as libvirt also makes use of
/machine/).
libsystemd-login can be used to query the machine name from a process.
This patch also includes numerous clean-ups for the cgroup code.
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/cgroup.c | 22 | ||||
-rw-r--r-- | src/core/dbus-unit.c | 2 |
2 files changed, 14 insertions, 10 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c index a248252bcd..83df0f3c9a 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -320,8 +320,9 @@ int cgroup_bonding_is_empty_list(CGroupBonding *first) { int manager_setup_cgroup(Manager *m) { _cleanup_free_ char *current = NULL, *path = NULL; + char suffix_buffer[sizeof("/systemd-") + DECIMAL_STR_MAX(pid_t)]; + const char *suffix; int r; - char suffix[sizeof("/systemd-") + DECIMAL_STR_MAX(pid_t)]; assert(m); @@ -332,17 +333,17 @@ int manager_setup_cgroup(Manager *m) { } /* 1. Determine hierarchy */ - r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 0, ¤t); + r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, ¤t); if (r < 0) { log_error("Cannot determine cgroup we are running in: %s", strerror(-r)); return r; } if (m->running_as == SYSTEMD_SYSTEM) - strcpy(suffix, "/system"); + suffix = "/system"; else { - snprintf(suffix, sizeof(suffix), "/systemd-%lu", (unsigned long) getpid()); - char_array_0(suffix); + sprintf(suffix_buffer, "/systemd-%lu", (unsigned long) getpid()); + suffix = suffix_buffer; } free(m->cgroup_hierarchy); @@ -350,11 +351,14 @@ int manager_setup_cgroup(Manager *m) { /* We probably got reexecuted and can continue to use our root cgroup */ m->cgroup_hierarchy = current; current = NULL; - } else { /* We need a new root cgroup */ - m->cgroup_hierarchy = NULL; - if (asprintf(&m->cgroup_hierarchy, "%s%s", streq(current, "/") ? "" : current, suffix) < 0) + if (streq(current, "/")) + m->cgroup_hierarchy = strdup(suffix); + else + m->cgroup_hierarchy = strappend(current, suffix); + + if (!m->cgroup_hierarchy) return log_oom(); } @@ -509,7 +513,7 @@ Unit* cgroup_unit_by_pid(Manager *m, pid_t pid) { if (pid <= 1) return NULL; - if (cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &group) < 0) + if (cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &group) < 0) return NULL; l = hashmap_get(m->cgroup_bondings, group); diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c index 5f1b2afd5b..8c1ce61151 100644 --- a/src/core/dbus-unit.c +++ b/src/core/dbus-unit.c @@ -1034,7 +1034,7 @@ int bus_unit_cgroup_unset(Unit *u, DBusMessageIter *iter) { unit_remove_drop_in(u, runtime, controller); /* Try to migrate the old group away */ - if (cg_get_by_pid(controller, 0, &target) >= 0) + if (cg_pid_get_path(controller, 0, &target) >= 0) cgroup_bonding_migrate_to(u->cgroup_bondings, target, false); cgroup_bonding_free(b, true); |