[lxc-devel] [lxcfs/master] Unified cgroup fixups

3XX0 on Github lxc-bot at linuxcontainers.org
Sat Mar 7 10:58:36 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 497 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200307/37b9d26d/attachment.bin>
-------------- next part --------------
From 9844eea7390fe24fdca9c315e1cb6cb69ad1a798 Mon Sep 17 00:00:00 2001
From: Jonathan Calmels <jbjcalmels at gmail.com>
Date: Sat, 7 Mar 2020 02:48:14 -0800
Subject: [PATCH 1/2] proc_cpuview: add minimal support for unified cgroup
 layout

Signed-off-by: Jonathan Calmels <jbjcalmels at gmail.com>
---
 src/cgroups/cgfsng.c |  2 +-
 src/proc_cpuview.c   | 24 ++++++++++++------------
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/cgroups/cgfsng.c b/src/cgroups/cgfsng.c
index 1fcd115..98d8ca6 100644
--- a/src/cgroups/cgfsng.c
+++ b/src/cgroups/cgfsng.c
@@ -768,7 +768,7 @@ static bool cgfsng_can_use_cpuview(struct cgroup_ops *ops)
 	struct hierarchy *cpu, *cpuacct;
 
 	if (pure_unified_layout(ops))
-		return false;
+		return true;
 
 	cpu = ops->get_hierarchy(ops, "cpu");
 	if (!cpu || is_unified_hierarchy(cpu))
diff --git a/src/proc_cpuview.c b/src/proc_cpuview.c
index 1d37b5d..4d8ead5 100644
--- a/src/proc_cpuview.c
+++ b/src/proc_cpuview.c
@@ -421,13 +421,19 @@ static bool read_cpu_cfs_param(const char *cg, const char *param, int64_t *value
 {
 	__do_free char *str = NULL;
 	char file[11 + 6 + 1]; /* cpu.cfs__us + quota/period + \0 */
+	bool first = true;
 
-	snprintf(file, sizeof(file), "cpu.cfs_%s_us", param);
+	if (!pure_unified_layout(cgroup_ops)) {
+		snprintf(file, sizeof(file), "cpu.cfs_%s_us", param);
+        } else {
+		strcpy(file, "cpu.max");
+		first = !strcmp(param, "quota");
+	}
 
 	if (!cgroup_ops->get(cgroup_ops, "cpu", cg, file, &str))
 		return false;
 
-	if (sscanf(str, "%"PRId64, value) != 1)
+	if (sscanf(str, first ? "%"PRId64 : "%*"PRId64" %"PRId64, value) != 1)
 		return false;
 
 	return true;
@@ -443,11 +449,8 @@ static double exact_cpu_count(const char *cg)
 	int nprocs;
 	int64_t cfs_quota, cfs_period;
 
-	if (!read_cpu_cfs_param(cg, "quota", &cfs_quota))
-		return 0;
-
-	if (!read_cpu_cfs_param(cg, "period", &cfs_period))
-		return 0;
+	read_cpu_cfs_param(cg, "quota", &cfs_quota);
+	read_cpu_cfs_param(cg, "period", &cfs_period);
 
 	if (cfs_quota <= 0 || cfs_period <= 0)
 		return 0;
@@ -473,11 +476,8 @@ int max_cpu_count(const char *cg)
 	int64_t cfs_quota, cfs_period;
 	int nr_cpus_in_cpuset = 0;
 
-	if (!read_cpu_cfs_param(cg, "quota", &cfs_quota))
-		return 0;
-
-	if (!read_cpu_cfs_param(cg, "period", &cfs_period))
-		return 0;
+	read_cpu_cfs_param(cg, "quota", &cfs_quota);
+	read_cpu_cfs_param(cg, "period", &cfs_period);
 
 	cpuset = get_cpuset(cg);
 	if (cpuset)

From a2632da98db1b2250a4d19ec1fcc75550b60a33f Mon Sep 17 00:00:00 2001
From: Jonathan Calmels <jbjcalmels at gmail.com>
Date: Sat, 7 Mar 2020 02:50:41 -0800
Subject: [PATCH 2/2] proc_fuse: fix meminfo with unified cgroup layout

Signed-off-by: Jonathan Calmels <jbjcalmels at gmail.com>
---
 src/proc_fuse.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/proc_fuse.c b/src/proc_fuse.c
index 43e4a7f..b62d6e4 100644
--- a/src/proc_fuse.c
+++ b/src/proc_fuse.c
@@ -203,14 +203,18 @@ static unsigned long get_memlimit(const char *cgroup, bool swap)
 {
 	__do_free char *memlimit_str = NULL;
 	unsigned long memlimit = -1;
+	char *ptr;
 	int ret;
 
 	if (swap)
 		ret = cgroup_ops->get_memory_swap_max(cgroup_ops, cgroup, &memlimit_str);
 	else
 		ret = cgroup_ops->get_memory_max(cgroup_ops, cgroup, &memlimit_str);
-	if (ret > 0)
-		memlimit = strtoul(memlimit_str, NULL, 10);
+	if (ret > 0) {
+		memlimit = strtoul(memlimit_str, &ptr, 10);
+		if (ptr == memlimit_str)
+			memlimit = -1;
+	}
 
 	return memlimit;
 }
@@ -226,6 +230,8 @@ static unsigned long get_min_memlimit(const char *cgroup, bool swap)
 		return log_error_errno(0, ENOMEM, "Failed to allocate memory");
 
 	retlimit = get_memlimit(copy, swap);
+	if (retlimit == -1)
+		retlimit = 0;
 
 	while (strcmp(copy, "/") != 0) {
 		char *it = copy;


More information about the lxc-devel mailing list