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.
67 lines
2.1 KiB
67 lines
2.1 KiB
7 years ago
|
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
|
||
|
|