You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.1 KiB
66 lines
2.1 KiB
From 72a9e0c3d4f8daca9f7dc389edbc1013d7c0d808 Mon Sep 17 00:00:00 2001 |
|
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com> |
|
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ó <nforro@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 |
|
|
|
|