From 3b716f2b274b2d2ae26c09e6ae17aaf81b016601 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 22 Dec 2016 14:09:39 +0100 Subject: [PATCH] merge: fix swap values with nested cgroups --- ...-fix-swap-values-with-nested-cgroups.patch | 164 ++++++++++++++++++ debian/patches/series | 1 + 2 files changed, 165 insertions(+) create mode 100644 debian/patches/0001-fix-swap-values-with-nested-cgroups.patch diff --git a/debian/patches/0001-fix-swap-values-with-nested-cgroups.patch b/debian/patches/0001-fix-swap-values-with-nested-cgroups.patch new file mode 100644 index 0000000..c217a7d --- /dev/null +++ b/debian/patches/0001-fix-swap-values-with-nested-cgroups.patch @@ -0,0 +1,164 @@ +From 018246ffa81294d6d6a9151e0310c82a3548fe2e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= +Date: Thu, 22 Dec 2016 13:12:04 +0100 +Subject: [PATCH lxcfs] fix swap values with nested cgroups +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +the memory limit was already correctly set by looking at the +whole cgroup hierarchy and using the minimum value, refactor +that code to support arbitrary files in the memory cgroup +and reuse it for the memsw limit as well. + +Signed-off-by: Fabian Grünbichler +--- + bindings.c | 52 +++++++++++----------------------------------------- + 1 file changed, 11 insertions(+), 41 deletions(-) + +diff --git a/bindings.c b/bindings.c +index 93c5aaa..3516be6 100644 +--- a/bindings.c ++++ b/bindings.c +@@ -3046,12 +3046,12 @@ static int read_file(const char *path, char *buf, size_t size, + * FUSE ops for /proc + */ + +-static unsigned long get_memlimit(const char *cgroup) ++static unsigned long get_memlimit(const char *cgroup, const char *file) + { + char *memlimit_str = NULL; + unsigned long memlimit = -1; + +- if (cgfs_get_value("memory", cgroup, "memory.limit_in_bytes", &memlimit_str)) ++ if (cgfs_get_value("memory", cgroup, file, &memlimit_str)) + memlimit = strtoul(memlimit_str, NULL, 10); + + free(memlimit_str); +@@ -3059,16 +3059,16 @@ static unsigned long get_memlimit(const char *cgroup) + return memlimit; + } + +-static unsigned long get_min_memlimit(const char *cgroup) ++static unsigned long get_min_memlimit(const char *cgroup, const char *file) + { + char *copy = strdupa(cgroup); + unsigned long memlimit = 0, retlimit; + +- retlimit = get_memlimit(copy); ++ retlimit = get_memlimit(copy, file); + + while (strcmp(copy, "/") != 0) { + copy = dirname(copy); +- memlimit = get_memlimit(copy); ++ memlimit = get_memlimit(copy, file); + if (memlimit != -1 && memlimit < retlimit) + retlimit = memlimit; + }; +@@ -3083,8 +3083,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, + struct file_info *d = (struct file_info *)fi->fh; + char *cg; + char *memusage_str = NULL, *memstat_str = NULL, +- *memswlimit_str = NULL, *memswusage_str = NULL, +- *memswlimit_default_str = NULL, *memswusage_default_str = NULL; ++ *memswlimit_str = NULL, *memswusage_str = NULL; + unsigned long memlimit = 0, memusage = 0, memswlimit = 0, memswusage = 0, + cached = 0, hosttotal = 0, active_anon = 0, inactive_anon = 0, + active_file = 0, inactive_file = 0, unevictable = 0; +@@ -3113,7 +3112,7 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, + return read_file("/proc/meminfo", buf, size, d); + prune_init_slice(cg); + +- memlimit = get_min_memlimit(cg); ++ memlimit = get_min_memlimit(cg, "memory.limit_in_bytes"); + if (!cgfs_get_value("memory", cg, "memory.usage_in_bytes", &memusage_str)) + goto err; + if (!cgfs_get_value("memory", cg, "memory.stat", &memstat_str)) +@@ -3124,20 +3123,9 @@ static int proc_meminfo_read(char *buf, size_t size, off_t offset, + if(cgfs_get_value("memory", cg, "memory.memsw.limit_in_bytes", &memswlimit_str) && + cgfs_get_value("memory", cg, "memory.memsw.usage_in_bytes", &memswusage_str)) + { +- /* If swapaccounting is turned on, then default value is assumed to be that of cgroup / */ +- if (!cgfs_get_value("memory", "/", "memory.memsw.limit_in_bytes", &memswlimit_default_str)) +- goto err; +- if (!cgfs_get_value("memory", "/", "memory.memsw.usage_in_bytes", &memswusage_default_str)) +- goto err; +- +- memswlimit = strtoul(memswlimit_str, NULL, 10); ++ memswlimit = get_min_memlimit(cg, "memory.memsw.limit_in_bytes"); + memswusage = strtoul(memswusage_str, NULL, 10); + +- if (!strcmp(memswlimit_str, memswlimit_default_str)) +- memswlimit = 0; +- if (!strcmp(memswusage_str, memswusage_default_str)) +- memswusage = 0; +- + memswlimit = memswlimit / 1024; + memswusage = memswusage / 1024; + } +@@ -3257,8 +3245,6 @@ err: + free(memswlimit_str); + free(memswusage_str); + free(memstat_str); +- free(memswlimit_default_str); +- free(memswusage_default_str); + return rv; + } + +@@ -3859,8 +3845,7 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, + struct fuse_context *fc = fuse_get_context(); + struct file_info *d = (struct file_info *)fi->fh; + char *cg = NULL; +- char *memswlimit_str = NULL, *memlimit_str = NULL, *memusage_str = NULL, *memswusage_str = NULL, +- *memswlimit_default_str = NULL, *memswusage_default_str = NULL; ++ char *memswlimit_str = NULL, *memlimit_str = NULL, *memusage_str = NULL, *memswusage_str = NULL; + unsigned long memswlimit = 0, memlimit = 0, memusage = 0, memswusage = 0, swap_total = 0, swap_free = 0; + ssize_t total_len = 0, rv = 0; + ssize_t l = 0; +@@ -3885,32 +3870,19 @@ static int proc_swaps_read(char *buf, size_t size, off_t offset, + return read_file("/proc/swaps", buf, size, d); + prune_init_slice(cg); + +- if (!cgfs_get_value("memory", cg, "memory.limit_in_bytes", &memlimit_str)) +- goto err; ++ memlimit = get_min_memlimit(cg, "memory.limit_in_bytes"); + + if (!cgfs_get_value("memory", cg, "memory.usage_in_bytes", &memusage_str)) + goto err; + +- memlimit = strtoul(memlimit_str, NULL, 10); + memusage = strtoul(memusage_str, NULL, 10); + + if (cgfs_get_value("memory", cg, "memory.memsw.usage_in_bytes", &memswusage_str) && + cgfs_get_value("memory", cg, "memory.memsw.limit_in_bytes", &memswlimit_str)) { + +- /* If swap accounting is turned on, then default value is assumed to be that of cgroup / */ +- if (!cgfs_get_value("memory", "/", "memory.memsw.limit_in_bytes", &memswlimit_default_str)) +- goto err; +- if (!cgfs_get_value("memory", "/", "memory.memsw.usage_in_bytes", &memswusage_default_str)) +- goto err; +- +- memswlimit = strtoul(memswlimit_str, NULL, 10); ++ memswlimit = get_min_memlimit(cg, "memory.memsw.limit_in_bytes"); + memswusage = strtoul(memswusage_str, NULL, 10); + +- if (!strcmp(memswlimit_str, memswlimit_default_str)) +- memswlimit = 0; +- if (!strcmp(memswusage_str, memswusage_default_str)) +- memswusage = 0; +- + swap_total = (memswlimit - memlimit) / 1024; + swap_free = (memswusage - memusage) / 1024; + } +@@ -3964,8 +3936,6 @@ err: + free(memlimit_str); + free(memusage_str); + free(memswusage_str); +- free(memswusage_default_str); +- free(memswlimit_default_str); + return rv; + } + +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index f0b6317..411c72e 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,3 @@ do-not-start-without-lxcfs.patch fix-offsets-for-memory.stat-parsing.patch +0001-fix-swap-values-with-nested-cgroups.patch -- 2.39.2