Order of parameters usually doesn't matter, but that's not the case with
memory.limit_in_bytes and memory.memsw.limit_in_bytes. When the latter
is first in the list of parameters, the resulting configuration is not
loadable with cgconfigparser.

This happens because when a cgroup is created, both memory.limit_in_bytes
and memory.memsw.limit_in_bytes parameters are initialized to highest
value possible (RESOURCE_MAX). And because memory.memsw.limit_in_bytes
must be always higher or equal to memory.limit_in_bytes, it's impossible
to change its value first.

Make sure that after constructing parameter list of memory subsystem,
the mentioned parameters are in correct order.

Signed-off-by: Nikola Forró <nfo...@redhat.com>
---
 src/api.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/api.c b/src/api.c
index c37855f..92730e6 100644
--- a/src/api.c
+++ b/src/api.c
@@ -2715,6 +2715,30 @@ int cgroup_get_cgroup(struct cgroup *cgroup)
                        }
                }
                closedir(dir);
+
+               if (! strcmp(cgc->name, "memory")) {
+                       /*
+                        * Make sure that memory.limit_in_bytes is placed before
+                        * memory.memsw.limit_in_bytes in the list of values
+                        */
+                       int memsw_limit = -1;
+                       int mem_limit = -1;
+
+                       for (j = 0; j < cgc->index; j++) {
+                               if (! strcmp(cgc->values[j]->name,
+                                                               
"memory.memsw.limit_in_bytes"))
+                                       memsw_limit = j;
+                               else if (! strcmp(cgc->values[j]->name,
+                                                                       
"memory.limit_in_bytes"))
+                                       mem_limit = j;
+                       }
+
+                       if (memsw_limit >= 0 && memsw_limit < mem_limit) {
+                               struct control_value *val = 
cgc->values[memsw_limit];
+                               cgc->values[memsw_limit] = 
cgc->values[mem_limit];
+                               cgc->values[mem_limit] = val;
+                       }
+               }
        }
 
        /* Check if the group really exists or not */
-- 
2.21.1



_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to