Blame SOURCES/libcgroup-0.41-api.c-fix-order-of-memory-subsystem-parameters.patch

2ae3c9
From 72a9e0c3d4f8daca9f7dc389edbc1013d7c0d808 Mon Sep 17 00:00:00 2001
2ae3c9
From: =?UTF-8?q?Nikola=20Forr=C3=B3?= <nforro@redhat.com>
2ae3c9
Date: Fri, 8 Apr 2016 17:00:19 +0200
2ae3c9
Subject: [PATCH] api.c: fix order of memory subsystem parameters generated by
2ae3c9
 cgsnapshot
2ae3c9
MIME-Version: 1.0
2ae3c9
Content-Type: text/plain; charset=UTF-8
2ae3c9
Content-Transfer-Encoding: 8bit
2ae3c9
2ae3c9
Order of parameters usually doesn't matter, but that's not the case with
2ae3c9
memory.limit_in_bytes and memory.memsw.limit_in_bytes. When the latter
2ae3c9
is first in the list of parameters, the resulting configuration is not
2ae3c9
loadable with cgconfigparser.
2ae3c9
2ae3c9
This happens because when a cgroup is created, both memory.limit_in_bytes
2ae3c9
and memory.memsw.limit_in_bytes parameters are initialized to highest
2ae3c9
value possible (RESOURCE_MAX). And because memory.memsw.limit_in_bytes
2ae3c9
must be always higher or equal to memory.limit_in_bytes, it's impossible
2ae3c9
to change its value first.
2ae3c9
2ae3c9
Make sure that after constructing parameter list of memory subsystem,
2ae3c9
the mentioned parameters are in correct order.
2ae3c9
2ae3c9
Signed-off-by: Nikola Forró <nforro@redhat.com>
2ae3c9
---
2ae3c9
 src/api.c | 24 ++++++++++++++++++++++++
2ae3c9
 1 file changed, 24 insertions(+)
2ae3c9
2ae3c9
diff --git a/src/api.c b/src/api.c
2ae3c9
index 0bf0615..f5da553 100644
2ae3c9
--- a/src/api.c
2ae3c9
+++ b/src/api.c
2ae3c9
@@ -2651,6 +2651,30 @@ int cgroup_get_cgroup(struct cgroup *cgroup)
2ae3c9
 			}
2ae3c9
 		}
2ae3c9
 		closedir(dir);
2ae3c9
+
2ae3c9
+		if (! strcmp(cgc->name, "memory")) {
2ae3c9
+			/*
2ae3c9
+			 * Make sure that memory.limit_in_bytes is placed before
2ae3c9
+			 * memory.memsw.limit_in_bytes in the list of values
2ae3c9
+			 */
2ae3c9
+			int memsw_limit = -1;
2ae3c9
+			int mem_limit = -1;
2ae3c9
+
2ae3c9
+			for (j = 0; j < cgc->index; j++) {
2ae3c9
+				if (! strcmp(cgc->values[j]->name,
2ae3c9
+								"memory.memsw.limit_in_bytes"))
2ae3c9
+					memsw_limit = j;
2ae3c9
+				else if (! strcmp(cgc->values[j]->name,
2ae3c9
+									"memory.limit_in_bytes"))
2ae3c9
+					mem_limit = j;
2ae3c9
+			}
2ae3c9
+
2ae3c9
+			if (memsw_limit >= 0 && memsw_limit < mem_limit) {
2ae3c9
+				struct control_value *val = cgc->values[memsw_limit];
2ae3c9
+				cgc->values[memsw_limit] = cgc->values[mem_limit];
2ae3c9
+				cgc->values[mem_limit] = val;
2ae3c9
+			}
2ae3c9
+		}
2ae3c9
 	}
2ae3c9
 
2ae3c9
 	/* Check if the group really exists or not */
2ae3c9
-- 
2ae3c9
2.4.11
2ae3c9