From: Nikola Forró Date: Thu, 16 Jan 2020 17:43:49 +0000 (+0100) Subject: api.c: Fix order of memory subsystem parameters generated by cgsnapshot X-Git-Tag: v0.42.1~1^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e0665ba7b9db6dcafc7213ec77f24dc2f7c2f996;p=thirdparty%2Flibcgroup.git api.c: Fix order of memory subsystem parameters generated by cgsnapshot 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ó Reviewed-by: Tom Hromatka --- diff --git a/src/api.c b/src/api.c index c37855f3..92730e6a 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 */