[LTP] [PATCH 1/2] memcg/memcontrol0[34]: Use expected values from the protection model
Sebastian Chlad
sebastianchlad@gmail.com
Sat Sep 26 22:44:53 CEST 2026
From: Sebastian Chlad <sebastian.chlad@suse.com>
memcontrol03 (memory.min) and memcontrol04 (memory.low) still expect
A/B/C ~= 33M and A/B/D ~= 17M after reclaim, which are the values from
the original kselftest. These were never derived from how the kernel
distributes protection among siblings, and the kselftest replaced them
with simulated values for both tests in kernel commit f10b6e9a8e66
("selftests: memcg: adjust expected reclaim values of protected
cgroups"):
A/B/C memory.current ~= 29M
A/B/D memory.current ~= 21M
(see tools/testing/selftests/cgroup/memcg_protection.m for the model).
Real kernels match the model, so the old D target leaves very little
room below the upper bound of the 20% tolerance. On 6.12 x86_64, 105
iterations of memcontrol03 across ext2, ext3, ext4, xfs and btrfs gave:
A/B/C 27.5M - 27.9M (old range 22.0M - 49.5M)
A/B/D 22.7M - 23.0M (old range 11.3M - 25.5M)
so A/B/D is already at ~90% of the old limit and small variations in
reclaim push it over. Passing runs on 6.4 ppc64le show the same
picture for both tests (C 22.6M - 32.0M, D 17.6M - 24.2M).
Switch to the model values. Keep the 20% tolerance, which is already
at least as wide as the kselftest's; kernel commit d2def68ae06a
("selftests: memcg: increase error tolerance of child memory.current
check in test_memcg_protection()") raised the kselftest tolerances to
15% (C) and 20% (D) for the same kind of sporadic failures.
This doesn't change the outcome where C is reclaimed far below D while
the unprotected A/B/F keeps its pagecache (seen e.g. on ppc64le with
C ~= 6M and F ~= 13M). That is a protection failure the tests should
keep reporting.
Signed-off-by: Sebastian Chlad <sebastian.chlad@suse.com>
---
testcases/kernel/controllers/memcg/memcontrol03.c | 13 +++++++------
testcases/kernel/controllers/memcg/memcontrol04.c | 13 +++++++------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/testcases/kernel/controllers/memcg/memcontrol03.c b/testcases/kernel/controllers/memcg/memcontrol03.c
index 96224c4ee..aa94f4999 100644
--- a/testcases/kernel/controllers/memcg/memcontrol03.c
+++ b/testcases/kernel/controllers/memcg/memcontrol03.c
@@ -18,9 +18,10 @@
* memory pressure in it.
*
* A/B memory.current ~= 50M
- * A/B/C memory.current ~= 33M
- * A/B/D memory.current ~= 17M
+ * A/B/C memory.current ~= 29M
+ * A/B/D memory.current ~= 21M
* A/B/E memory.current ~= 0
+ * (for origin of the numbers, see model in memcg_protection.m.)
*
* After that it tries to allocate more than there is unprotected
* memory in A available, and checks that memory.min protects
@@ -217,10 +218,10 @@ static void test_memcg_min(void)
for (i = 0; i < ARRAY_SIZE(leaf_cg); i++)
SAFE_CG_SCANF(leaf_cg[i], "memory.current", "%ld", c + i);
- TST_EXP_EXPR(values_close(c[0], MB(33), 20),
- "(A/B/C memory.current=%ld) ~= %d", c[0], MB(33));
- TST_EXP_EXPR(values_close(c[1], MB(17), 20),
- "(A/B/D memory.current=%ld) ~= %d", c[1], MB(17));
+ TST_EXP_EXPR(values_close(c[0], MB(29), 20),
+ "(A/B/C memory.current=%ld) ~= %d", c[0], MB(29));
+ TST_EXP_EXPR(values_close(c[1], MB(21), 20),
+ "(A/B/D memory.current=%ld) ~= %d", c[1], MB(21));
TST_EXP_EXPR(values_close(c[2], 0, 1),
"(A/B/E memory.current=%ld) ~= 0", c[2]);
diff --git a/testcases/kernel/controllers/memcg/memcontrol04.c b/testcases/kernel/controllers/memcg/memcontrol04.c
index 22ca1df8c..92ab53a51 100644
--- a/testcases/kernel/controllers/memcg/memcontrol04.c
+++ b/testcases/kernel/controllers/memcg/memcontrol04.c
@@ -17,9 +17,10 @@
* memory pressure in it.
*
* A/B memory.current ~= 50M
- * A/B/C memory.current ~= 33M
- * A/B/D memory.current ~= 17M
+ * A/B/C memory.current ~= 29M
+ * A/B/D memory.current ~= 21M
* A/B/E memory.current ~= 0
+ * (for origin of the numbers, see model in memcg_protection.m.)
*
* After that it tries to allocate more than there is unprotected
* memory in A available, and checks that memory.low protects
@@ -182,10 +183,10 @@ static void test_memcg_low(void)
for (i = 0; i < ARRAY_SIZE(leaf_cg); i++)
SAFE_CG_SCANF(leaf_cg[i], "memory.current", "%ld", c + i);
- TST_EXP_EXPR(values_close(c[0], MB(33), 20),
- "(A/B/C memory.current=%ld) ~= %d", c[C], MB(33));
- TST_EXP_EXPR(values_close(c[1], MB(17), 20),
- "(A/B/D memory.current=%ld) ~= %d", c[D], MB(17));
+ TST_EXP_EXPR(values_close(c[0], MB(29), 20),
+ "(A/B/C memory.current=%ld) ~= %d", c[C], MB(29));
+ TST_EXP_EXPR(values_close(c[1], MB(21), 20),
+ "(A/B/D memory.current=%ld) ~= %d", c[D], MB(21));
TST_EXP_EXPR(values_close(c[2], 0, 1),
"(A/B/E memory.current=%ld) ~= 0", c[E]);
tst_res(TINFO, "A/B/F memory.current=%ld", c[F]);
--
2.51.0
More information about the ltp
mailing list