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 0bf0615..f5da553 100644
--- a/src/api.c
+++ b/src/api.c
@@ -2651,6 +2651,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.4.11



------------------------------------------------------------------------------
Find and fix application performance issues faster with Applications Manager
Applications Manager provides deep performance insights into multiple tiers of
your business applications. It resolves application problems quickly and
reduces your MTTR. Get your free trial!
https://ad.doubleclick.net/ddm/clk/302982198;130105516;z
_______________________________________________
Libcg-devel mailing list
Libcg-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to