]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Sort the cgroup memory settings before applying.
authorKien Truong <duckientruong@gmail.com>
Sun, 5 Apr 2015 23:46:22 +0000 (23:46 +0000)
committerStéphane Graber <stgraber@ubuntu.com>
Fri, 28 Aug 2015 22:02:16 +0000 (18:02 -0400)
Add a function to sort the cgroup settings before applying.
Currently, the function will put memory.memsw.limit_in_bytes after
memory.limit_in_bytes setting so the container will start
regardless of the order specified in the input. Fix #453

Signed-off-by: Kien Truong <duckientruong@gmail.com>
src/lxc/cgfs.c
src/lxc/cgmanager.c
src/lxc/conf.c
src/lxc/conf.h

index a3adc37f65d672533d385c26a61fba5c3d2705b3..8aedfe4ec6027273e06979c466ec7893aa91c649 100644 (file)
@@ -1888,12 +1888,15 @@ static int do_setup_cgroup_limits(struct cgfs_data *d,
 {
        struct lxc_list *iterator;
        struct lxc_cgroup *cg;
+       struct lxc_list *sorted_cgroup_settings;
        int ret = -1;
 
        if (lxc_list_empty(cgroup_settings))
                return 0;
 
-       lxc_list_for_each(iterator, cgroup_settings) {
+       sorted_cgroup_settings = sort_cgroup_settings(cgroup_settings);
+
+       lxc_list_for_each(iterator, sorted_cgroup_settings) {
                cg = iterator->elem;
 
                if (do_devices == !strncmp("devices", cg->subsystem, 7)) {
@@ -1916,6 +1919,10 @@ static int do_setup_cgroup_limits(struct cgfs_data *d,
        ret = 0;
        INFO("cgroup has been setup");
 out:
+       lxc_list_for_each(iterator, sorted_cgroup_settings) {
+               lxc_list_del(iterator);
+               free(iterator);
+       }
        return ret;
 }
 
index ffbcae3647d8ff5714adac5c6d767fde752b3869..0d1b73f363bc4da4f5bb39f4314ac30ebf272c54 100644 (file)
@@ -1335,6 +1335,7 @@ static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool
        struct lxc_list *iterator;
        struct lxc_cgroup *cg;
        bool ret = false;
+       struct lxc_list *sorted_cgroup_settings;
 
        if (lxc_list_empty(cgroup_settings))
                return true;
@@ -1347,7 +1348,9 @@ static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool
                return false;
        }
 
-       lxc_list_for_each(iterator, cgroup_settings) {
+       sorted_cgroup_settings = sort_cgroup_settings(cgroup_settings);
+
+       lxc_list_for_each(iterator, sorted_cgroup_settings) {
                char controller[100], *p;
                cg = iterator->elem;
                if (do_devices != !strncmp("devices", cg->subsystem, 7))
@@ -1375,6 +1378,10 @@ static bool cgm_setup_limits(void *hdata, struct lxc_list *cgroup_settings, bool
        ret = true;
        INFO("cgroup limits have been setup");
 out:
+       lxc_list_for_each(iterator, sorted_cgroup_settings) {
+               lxc_list_del(iterator);
+               free(iterator);
+       }
        cgm_dbus_disconnect();
        return ret;
 }
index 38473f66d113025697b69813132594fea5d873f8..39756a536328faaed12eb24c871509688c1bb525 100644 (file)
@@ -4829,3 +4829,38 @@ void suggest_default_idmap(void)
        free(gname);
        free(uname);
 }
+
+/*
+ * Return the list of cgroup_settings sorted according to the following rules
+ * 1. Put memory.limit_in_bytes before memory.memsw.limit_in_bytes
+ */
+struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings)
+{
+       struct lxc_list *result;
+       struct lxc_list *memsw_limit = NULL;
+       struct lxc_list *it = NULL;
+       struct lxc_cgroup *cg = NULL;
+       struct lxc_list *item = NULL;
+
+       result = malloc(sizeof(*result));
+       lxc_list_init(result);
+
+       /*Iterate over the cgroup settings and copy them to the output list*/
+       lxc_list_for_each(it, cgroup_settings) {
+               item = malloc(sizeof(*item));
+               item->elem = it->elem;
+               cg = it->elem;
+               if (strcmp(cg->subsystem, "memory.memsw.limit_in_bytes") == 0) {
+                       /* Store the memsw_limit location */
+                       memsw_limit = item;
+               } else if (strcmp(cg->subsystem, "memory.limit_in_bytes") == 0 && memsw_limit != NULL) {
+                       /* lxc.cgroup.memory.memsw.limit_in_bytes is found before 
+                        * lxc.cgroup.memory.limit_in_bytes, swap these two items */
+                       item->elem = memsw_limit->elem;
+                       memsw_limit->elem = it->elem;
+               }
+               lxc_list_add_tail(result, item);
+       }
+
+       return result;
+}
index 3416124378dea71b54574e7f24132d319d9c4819..ac2b58ca8aef896e2951454a447e25873ea2d857 100644 (file)
@@ -401,4 +401,5 @@ extern int parse_mntopts(const char *mntopts, unsigned long *mntflags,
 extern void tmp_proc_unmount(struct lxc_conf *lxc_conf);
 void remount_all_slave(void);
 extern void suggest_default_idmap(void);
+struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings);
 #endif