]> 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>
Wed, 1 Jul 2015 15:53:13 +0000 (11:53 -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 11a5925df82a0f4110d46fd261be3126f6edec17..0b7f99818c6044ed0efc4bd3de105ebdfce9e7ac 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 c8d0745b415cc6e1b3e4167f46cc07724e2cff25..51373913d0604461fad09319d60c8e4c65744047 100644 (file)
@@ -1221,6 +1221,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;
@@ -1233,7 +1234,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))
@@ -1261,6 +1264,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 df7bd706d3b2fdf91d8c508552a873d34c3d0bfe..3b2905c329ec50b5c8c0ed96ceeb6ed67b900714 100644 (file)
@@ -4557,3 +4557,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;
+}
\ No newline at end of file
index f3f8fd5f8b54b2ddea2cdd57fc9a761181ec234d..c01e1a4dd02533dcb7663ae953c8c95efd31a1f5 100644 (file)
@@ -430,4 +430,5 @@ extern void tmp_proc_unmount(struct lxc_conf *lxc_conf);
 void remount_all_slave(void);
 extern void suggest_default_idmap(void);
 FILE *write_mount_file(struct lxc_list *mount);
+struct lxc_list *sort_cgroup_settings(struct lxc_list* cgroup_settings);
 #endif