]> git.proxmox.com Git - mirror_lxc.git/commitdiff
cgroups: honor lxc.cgroup.pattern if set explicitly
authorChristian Brauner <christian.brauner@ubuntu.com>
Thu, 27 Feb 2020 22:02:31 +0000 (23:02 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 28 Feb 2020 10:07:39 +0000 (11:07 +0100)
Link: https://discuss.linuxcontainers.org/t/lxc-cgroup-pattern-is-not-being-honored
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
configure.ac
src/lxc/cgroups/cgfsng.c
src/lxc/initutils.c

index 28f34f13f5161eb9d5634e5f15208cd74d242a83..31bf90b15c63190d1924a709ceea23958228faac 100644 (file)
@@ -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],
index aa054a63d3e17eef041f5ef0fb62a0604ca262cf..5dfffcd92a84d348d7cfa60ce0a8002aea89ca39 100644 (file)
@@ -1243,7 +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 *monitor_cgroup = NULL;
+       __do_free char *monitor_cgroup = NULL, *__cgroup_tree = NULL;
        const char *cgroup_tree;
        int idx = 0;
        int i;
@@ -1264,17 +1264,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 +1317,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 +1338,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 +3191,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;
 }
index 41ed9e9425433171ff4b3736d083ef83ec0b5044..e5d45230729dbfb103bed095174ca09e2e1da8bd 100644 (file)
@@ -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];