* [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM
@ 2026-08-28 3:37 Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 1/2] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback Wilson Felipe Pereira
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Wilson Felipe Pereira @ 2026-08-28 3:37 UTC (permalink / raw)
To: Andrew Morton, Johannes Weiner, Yosry Ahmed, Nhat Pham,
Chengming Zhou, Tejun Heo, Michal Koutný, Shuah Khan
Cc: linux-mm, cgroups, linux-kselftest, linux-kernel,
Wilson Felipe Pereira
This series fixes two test failures in test_zswap observed when running on
a single-core VM (-smp 1) with 4GB of RAM.
Patch 1 addresses a race condition in test_zswap_writeback() where
waitpid() returns before the exiting child process is switched away by the
kernel, causing an immediate write of "+memory" to cgroup.subtree_control
to fail with -EBUSY. We fix this by waiting for cgroup.events to report
"populated 0".
Patch 2 fixes an implicit unsigned conversion bug in test_no_kmem_bypass()
where small negative timing differences between debugfs stored_pages and
cgroup zswapped bytes caused the comparison to falsely fail due to
unsigned promotion.
v3 -> v4:
- Patch 2: Use `long long` for `delta` and `max_delta` to avoid integer
overflow on 32-bit platforms (Andrew Morton, Sashiko).
v2 -> v3:
- Patch 1: Collect Acked-by from Michal Koutný.
- Patch 2: Explicitly cast stored_pages to (long) in delta calculation and
inline the return comparison (Michal Koutný).
v1 -> v2:
- Patch 1: Replace EBUSY retry loop with cg_read_strcmp_wait() waiting for
cgroup.events "populated 0" (Michal Koutný).
- Patch 1: Clarify task lifecycle in commit description (Yosry Ahmed).
- Patch 2: Remove abs() and declare delta/zswapped as signed longs with a
signed threshold comparison (Michal Koutný).
- Patch 2: Add Fixes tag (Michal Koutný).
v3: https://lore.kernel.org/all/20260827034807.2822234-1-wfelipe@google.com/
v2: https://lore.kernel.org/all/20260824033533.2147900-1-wfelipe@google.com/
v1: https://lore.kernel.org/all/20260804042053.56940-1-wfelipe@google.com/
Wilson Felipe Pereira (2):
selftests/cgroup: test_zswap: wait for cgroup to unpopulate in
test_zswap_writeback
selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in
test_no_kmem_bypass
tools/testing/selftests/cgroup/test_zswap.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
--
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v4 1/2] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback
2026-08-28 3:37 [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Wilson Felipe Pereira
@ 2026-08-28 3:37 ` Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 2/2] selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in test_no_kmem_bypass Wilson Felipe Pereira
2026-08-28 18:53 ` [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Andrew Morton
2 siblings, 0 replies; 4+ messages in thread
From: Wilson Felipe Pereira @ 2026-08-28 3:37 UTC (permalink / raw)
To: Andrew Morton, Johannes Weiner, Yosry Ahmed, Nhat Pham,
Chengming Zhou, Tejun Heo, Michal Koutný, Shuah Khan
Cc: linux-mm, cgroups, linux-kselftest, linux-kernel,
Wilson Felipe Pereira
When running test_zswap on a single-core VM (-smp 1) with 4GB of RAM,
test_zswap_writeback intermittently fails on the initial run after boot.
In test_zswap_writeback(), after waitpid() reaps the child process created
by test_zswap_writeback_one(), writing "+memory" to cgroup.subtree_control
can fail with -EBUSY. Under cgroup v2, enabling domain subtree controllers
is forbidden while any tasks remain in cgroup.procs.
When a child process exits, exit_notify() wakes the parent process,
allowing waitpid() to return immediately. However, the cgroup populated
task count (nr_populated_csets) is only decremented when the exiting
task is switched away via finish_task_switch() -> cgroup_task_dead(). On
single-core systems, the parent runs before the dead child has been
switched out, causing "+memory" to fail with -EBUSY if written immediately
after waitpid() returns.
Fix this by waiting for cgroup.events to report "populated 0\n" via
cg_read_strcmp_wait() before enabling subtree control.
Signed-off-by: Wilson Felipe Pereira <wfelipe@google.com>
Acked-by: Michal Koutný <mkoutny@suse.com>
---
tools/testing/selftests/cgroup/test_zswap.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/selftests/cgroup/test_zswap.c
index f7b4c4370db6..1d3c410252e4 100644
--- a/tools/testing/selftests/cgroup/test_zswap.c
+++ b/tools/testing/selftests/cgroup/test_zswap.c
@@ -408,6 +408,8 @@ static int test_zswap_writeback(const char *root, bool wb)
* Thus, the parent's setting shall be what's in effect. */
if (cg_write(test_group, "memory.zswap.max", "max"))
goto out;
+ if (cg_read_strcmp_wait(test_group, "cgroup.events", "populated 0\n"))
+ goto out;
if (cg_write(test_group, "cgroup.subtree_control", "+memory"))
goto out;
--
2.55.0.897.gb25b4bd76c-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v4 2/2] selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in test_no_kmem_bypass
2026-08-28 3:37 [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 1/2] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback Wilson Felipe Pereira
@ 2026-08-28 3:37 ` Wilson Felipe Pereira
2026-08-28 18:53 ` [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Andrew Morton
2 siblings, 0 replies; 4+ messages in thread
From: Wilson Felipe Pereira @ 2026-08-28 3:37 UTC (permalink / raw)
To: Andrew Morton, Johannes Weiner, Yosry Ahmed, Nhat Pham,
Chengming Zhou, Tejun Heo, Michal Koutný, Shuah Khan
Cc: linux-mm, cgroups, linux-kselftest, linux-kernel,
Wilson Felipe Pereira
In test_no_kmem_bypass(), delta (stored_pages * page_size - zswapped) is
checked against stored_pages * page_size / 4 to verify that the pages
pushed to zswap belong to the test memory cgroup.
Due to slight stat update timing differences, delta can evaluate to a small
negative number (e.g. -5MB out of 1GB). Because delta is declared as a
signed int and stored_pages is an unsigned size_t, C's usual arithmetic
conversions implicitly promote a negative delta to a large unsigned 64-bit
integer, causing `delta < stored_pages * page_size / 4` to falsely evaluate
to 0 and fail the test.
Fix this by declaring zswapped and delta as signed long long and comparing
against a signed threshold, ensuring negative deltas correctly evaluate
to true.
Fixes: a549f9f31561a ("selftests: cgroup: add test_zswap with no kmem bypass test")
Signed-off-by: Wilson Felipe Pereira <wfelipe@google.com>
Acked-by: Michal Koutný <mkoutny@suse.com>
---
tools/testing/selftests/cgroup/test_zswap.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/cgroup/test_zswap.c b/tools/testing/selftests/cgroup/test_zswap.c
index 1d3c410252e4..2e7d123e0949 100644
--- a/tools/testing/selftests/cgroup/test_zswap.c
+++ b/tools/testing/selftests/cgroup/test_zswap.c
@@ -630,11 +630,14 @@ static int test_no_kmem_bypass(const char *root)
break;
/* If memory was pushed to zswap, verify it belongs to memcg */
if (stored_pages > stored_pages_threshold) {
- int zswapped = cg_read_key_long(test_group, "memory.stat", "zswapped ");
- int delta = stored_pages * page_size - zswapped;
- int result_ok = delta < stored_pages * page_size / 4;
-
- ret = result_ok ? KSFT_PASS : KSFT_FAIL;
+ long zswapped = cg_read_key_long(
+ test_group, "memory.stat", "zswapped ");
+ long long delta =
+ (long long)stored_pages * page_size - zswapped;
+ long long max_delta =
+ (long long)stored_pages * page_size / 4;
+
+ ret = (delta < max_delta) ? KSFT_PASS : KSFT_FAIL;
break;
}
}
--
2.55.0.897.gb25b4bd76c-goog
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM
2026-08-28 3:37 [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 1/2] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 2/2] selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in test_no_kmem_bypass Wilson Felipe Pereira
@ 2026-08-28 18:53 ` Andrew Morton
2 siblings, 0 replies; 4+ messages in thread
From: Andrew Morton @ 2026-08-28 18:53 UTC (permalink / raw)
To: Wilson Felipe Pereira
Cc: Johannes Weiner, Yosry Ahmed, Nhat Pham, Chengming Zhou,
Tejun Heo, Michal Koutný , Shuah Khan, linux-mm, cgroups,
linux-kselftest, linux-kernel
On Fri, 28 Aug 2026 03:37:30 +0000 Wilson Felipe Pereira <wfelipe@google.com> wrote:
> This series fixes two test failures in test_zswap observed when running on
> a single-core VM (-smp 1) with 4GB of RAM.
Thanks, let me queue this for test and additional review.
There might be an issue on 32-bit:
https://sashiko.dev/#/patchset/20260828033741.2184560-1-wfelipe@google.com
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-08-28 18:53 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-28 3:37 [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 1/2] selftests/cgroup: test_zswap: wait for cgroup to unpopulate in test_zswap_writeback Wilson Felipe Pereira
2026-08-28 3:37 ` [PATCH v4 2/2] selftests/cgroup: test_zswap: fix implicit unsigned promotion bug in test_no_kmem_bypass Wilson Felipe Pereira
2026-08-28 18:53 ` [PATCH v4 0/2] selftests/cgroup: fixes for test_zswap on single core VM Andrew Morton
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.