From 72a9e0c3d4f8daca9f7dc389edbc1013d7c0d808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikola=20Forr=C3=B3?= Date: Fri, 8 Apr 2016 17:00:19 +0200 Subject: [PATCH] api.c: fix order of memory subsystem parameters generated by cgsnapshot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ó --- 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