The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3270
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Link: https://discuss.linuxcontainers.org/t/lxc-cgroup-pattern-is-not-being-honored Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 940455840a8d3fae3ce81847bcb3a83b8ac81bf2 Mon Sep 17 00:00:00 2001 From: Christian Brauner <christian.brau...@ubuntu.com> Date: Thu, 27 Feb 2020 23:02:31 +0100 Subject: [PATCH] cgroups: honor lxc.cgroup.pattern if set explicitly Link: https://discuss.linuxcontainers.org/t/lxc-cgroup-pattern-is-not-being-honored Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com> --- configure.ac | 2 +- src/lxc/cgroups/cgfsng.c | 35 ++++++++++++++++++++++------------- src/lxc/initutils.c | 4 ++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index 28f34f13f5..31bf90b15c 100644 --- a/configure.ac +++ b/configure.ac @@ -487,7 +487,7 @@ AC_ARG_WITH([rootfs-path], # cgroup pattern specification AC_ARG_WITH([cgroup-pattern], [AS_HELP_STRING([--with-cgroup-pattern=pattern], [pattern for container cgroups])], - [with_cgroup_pattern=$withval], [with_cgroup_pattern=['lxc.payload.%n']]) + [with_cgroup_pattern=$withval], [with_cgroup_pattern=['']]) # The path for the apparmor_parser's cache for generated apparmor profiles AC_ARG_WITH([apparmor-cache-dir], diff --git a/src/lxc/cgroups/cgfsng.c b/src/lxc/cgroups/cgfsng.c index aa054a63d3..9264ee7e4a 100644 --- a/src/lxc/cgroups/cgfsng.c +++ b/src/lxc/cgroups/cgfsng.c @@ -1243,6 +1243,7 @@ static void cgroup_remove_leaf(struct hierarchy *h, bool payload) __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, struct lxc_handler *handler) { + __do_free char *container_cgroup = NULL, *__cgroup_tree = NULL; __do_free char *monitor_cgroup = NULL; const char *cgroup_tree; int idx = 0; @@ -1264,17 +1265,23 @@ __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, return ret_set_errno(false, EINVAL); conf = handler->conf; - cgroup_tree = conf->cgroup_meta.dir; - if (cgroup_tree) + if (conf->cgroup_meta.dir) { + cgroup_tree = conf->cgroup_meta.dir; monitor_cgroup = must_concat(&len, conf->cgroup_meta.dir, "/", DEFAULT_MONITOR_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); - else + } else if (ops->cgroup_pattern) { + __cgroup_tree = lxc_string_replace("%n", handler->name, ops->cgroup_pattern); + cgroup_tree = __cgroup_tree; + monitor_cgroup = must_concat(&len, cgroup_tree, + CGROUP_CREATE_RETRY, NULL); + } else { monitor_cgroup = must_concat(&len, DEFAULT_MONITOR_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); + } if (!monitor_cgroup) return ret_set_errno(false, ENOMEM); @@ -1311,7 +1318,7 @@ __cgfsng_ops static inline bool cgfsng_monitor_create(struct cgroup_ops *ops, __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops, struct lxc_handler *handler) { - __do_free char *container_cgroup = NULL; + __do_free char *container_cgroup = NULL, *__cgroup_tree = NULL; const char *cgroup_tree; int idx = 0; int i; @@ -1332,17 +1339,23 @@ __cgfsng_ops static inline bool cgfsng_payload_create(struct cgroup_ops *ops, return ret_set_errno(false, EINVAL); conf = handler->conf; - cgroup_tree = conf->cgroup_meta.dir; - if (cgroup_tree) + if (conf->cgroup_meta.dir) { + cgroup_tree = conf->cgroup_meta.dir; container_cgroup = must_concat(&len, cgroup_tree, "/", DEFAULT_PAYLOAD_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); - else + } else if (ops->cgroup_pattern) { + __cgroup_tree = lxc_string_replace("%n", handler->name, ops->cgroup_pattern); + cgroup_tree = __cgroup_tree; + container_cgroup = must_concat(&len, cgroup_tree, + CGROUP_CREATE_RETRY, NULL); + } else { container_cgroup = must_concat(&len, DEFAULT_PAYLOAD_CGROUP_PREFIX, handler->name, CGROUP_CREATE_RETRY, NULL); + } if (!container_cgroup) return ret_set_errno(false, ENOMEM); @@ -3179,12 +3192,8 @@ __cgfsng_ops static int cgfsng_data_init(struct cgroup_ops *ops) /* copy system-wide cgroup information */ cgroup_pattern = lxc_global_config_value("lxc.cgroup.pattern"); - if (!cgroup_pattern) { - /* lxc.cgroup.pattern is only NULL on error. */ - ERROR("Failed to retrieve cgroup pattern"); - return ret_set_errno(-1, ENOMEM); - } - ops->cgroup_pattern = must_copy_string(cgroup_pattern); + if (cgroup_pattern && strcmp(cgroup_pattern, "") != 0) + ops->cgroup_pattern = must_copy_string(cgroup_pattern); return 0; } diff --git a/src/lxc/initutils.c b/src/lxc/initutils.c index 41ed9e9425..e5d4523072 100644 --- a/src/lxc/initutils.c +++ b/src/lxc/initutils.c @@ -84,13 +84,13 @@ const char *lxc_global_config_value(const char *option_name) sprintf(user_config_path, "%s/.config/lxc/lxc.conf", user_home); sprintf(user_default_config_path, "%s/.config/lxc/default.conf", user_home); sprintf(user_lxc_path, "%s/.local/share/lxc/", user_home); - user_cgroup_pattern = strdup("%n"); } else { user_config_path = strdup(LXC_GLOBAL_CONF); user_default_config_path = strdup(LXC_DEFAULT_CONFIG); user_lxc_path = strdup(LXCPATH); - user_cgroup_pattern = strdup(DEFAULT_CGROUP_PATTERN); + if (strcmp(DEFAULT_CGROUP_PATTERN, "") != 0) + user_cgroup_pattern = strdup(DEFAULT_CGROUP_PATTERN); } const char * const (*ptr)[2];
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel