From d541b31cc867960110c5fb974ecc1b2f78299196 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Mon, 21 Nov 2016 14:45:53 -0500 Subject: [PATCH] core: make SYSTEMD_CGROUP_CONTROLLER a special string SYSTEMD_CGROUP_CONTROLLER is currently defined as "name=elogind" which cgroup utility functions interpret as a named cgroup hierarchy with the specified named. With the planned cgroup hybrid mode changes, SYSTEMD_CGROUP_CONTROLLER would map to different hierarchy names. This patch makes SYSTEMD_CGROUP_CONTROLLER a special string "_elogind" which is substituted to "name=elogind" by the cgroup utility functions. This allows the callers to address the elogind hierarchy without actually specifying the hierarchy name allowing the cgroup utility functions to map it to whatever is appropriate. Note that SYSTEMD_CGROUP_CONTROLLER was already special on full unified cgroup hierarchy even before this patch. --- Makefile.am | 1 - src/basic/cgroup-util.c | 20 ++++++++++++++++---- src/core/cgroup.c | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Makefile.am b/Makefile.am index eb95cc899..03797d48d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -129,7 +129,6 @@ AM_CPPFLAGS = \ -DPKGSYSCONFDIR=\"$(pkgsysconfdir)\" \ -DSYSTEMD_CGROUP_CONTROLLER=\"_$(CGROUP_CONTROLLER)\" \ -DSYSTEMD_CGROUP_CONTROLLER_LEGACY=\"name=$(CGROUP_CONTROLLER)\" \ - -DSYSTEMD_CGROUP_CONTROLLER_HYBRID=\"name=$(CGROUP_CONTROLLER)\" \ -DSYSTEMD_CGROUP_AGENT_PATH=\"$(rootlibexecdir)/elogind-cgroups-agent\" \ -DUDEVLIBEXECDIR=\"$(udevlibexecdir)\" \ -DPOLKIT_AGENT_BINARY_PATH=\"$(PKTTYAGENT)\" \ diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index bcb022896..272fb1973 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -548,6 +548,9 @@ static const char *controller_to_dirname(const char *controller) { * just cuts off the name= prefixed used for named * hierarchies, if it is specified. */ + if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) + controller = SYSTEMD_CGROUP_CONTROLLER_LEGACY; + e = startswith(controller, "name="); if (e) return e; @@ -920,7 +923,7 @@ int cg_get_xattr(const char *controller, const char *path, const char *name, voi int cg_pid_get_path(const char *controller, pid_t pid, char **path) { _cleanup_fclose_ FILE *f = NULL; char line[LINE_MAX]; - const char *fs; + const char *fs, *controller_str; size_t cs = 0; bool unified; @@ -934,8 +937,14 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { controller = SYSTEMD_CGROUP_CONTROLLER; unified = cg_unified(controller); - if (!unified) - cs = strlen(controller); + if (!unified) { + if (streq(controller, SYSTEMD_CGROUP_CONTROLLER)) + controller_str = SYSTEMD_CGROUP_CONTROLLER_LEGACY; + else + controller_str = controller; + + cs = strlen(controller_str); + } fs = procfs_file_alloca(pid, "cgroup"); log_debug_elogind("Searching for PID %u in \"%s\" (controller \"%s\")", @@ -974,7 +983,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { *e = 0; FOREACH_WORD_SEPARATOR(word, k, l, ",", state) { - if (k == cs && memcmp(word, controller, cs) == 0) { + if (k == cs && memcmp(word, controller_str, cs) == 0) { found = true; break; } @@ -1860,6 +1869,9 @@ bool cg_controller_is_valid(const char *p) { if (!p) return false; + if (streq(p, SYSTEMD_CGROUP_CONTROLLER)) + return true; + s = startswith(p, "name="); if (s) p = s; diff --git a/src/core/cgroup.c b/src/core/cgroup.c index e306b8bce..8f6e5e072 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -1806,7 +1806,7 @@ int manager_setup_cgroup(Manager *m) { else if (cg_unified(SYSTEMD_CGROUP_CONTROLLER)) log_debug("Unified cgroup hierarchy is located at %s. Controllers are on legacy hierarchies.", path); else - log_debug("Using cgroup controller " SYSTEMD_CGROUP_CONTROLLER ". File system hierarchy is at %s.", path); + log_debug("Using cgroup controller " SYSTEMD_CGROUP_CONTROLLER_LEGACY ". File system hierarchy is at %s.", path); if (!m->test_run) { const char *scope_path; -- 2.30.2