[lxc-devel] [lxc/master] cgroups: honor lxc.cgroup.pattern if set explicitly

brauner on Github lxc-bot at linuxcontainers.org
Thu Feb 27 22:03:37 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 449 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200227/e33ba81b/attachment.bin>
-------------- next part --------------
From 940455840a8d3fae3ce81847bcb3a83b8ac81bf2 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at 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.brauner at 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];


More information about the lxc-devel mailing list