Re: cgroup/test_zswap failed with "zswpout does not increase after test program"
From: Yosry Ahmed
Date: Tue Jul 07 2026 - 14:25:41 EST
On Tue, Jul 7, 2026 at 2:38 AM Zenghui Yu <zenghui.yu@xxxxxxxxx> wrote:
>
> Hi,
>
> Running cgroup/test_zswap on my arm64 box failed immediately with:
>
> [root@localhost cgroup]# ./test_zswap
> TAP version 13
> 1..8
> # zswpout does not increase after test program
> not ok 1 test_zswap_usage
> [...]
>
> I'm sure that pages are successfully written into zswap by checking the
> count_memcg_events(.., idx=ZSWPOUT, ..) trace events. But "zswpout_after"
> in test_zswap_usage() is 0 and results in this failure.
>
> I guess the problem is that (in this particular case) the memcg stats has
> not been flushed when userspace reads it.
>
> memcg_stat_format()
> mem_cgroup_flush_stats()
> __mem_cgroup_flush_stats(.., force=false)
> needs_flush = memcg_vmstats_needs_flush();
>
> static bool memcg_vmstats_needs_flush(struct memcg_vmstats *vmstats)
> {
> return atomic_long_read(&vmstats->stats_updates) >
> MEMCG_CHARGE_BATCH * num_online_cpus();
> }
>
> I can image that memcg_vmstats_needs_flush() will return false because I'm
> testing a 16k-page-size kernel on a box with 96 cpus..
>
> As we have a periodic flusher flushed all the stats every 2 seconds, I use
> the following diff to wait the flusher to expose the accurate stats to
> userspace.
>
> diff --git a/tools/testing/selftests/cgroup/lib/cgroup_util.c b/tools/testing/selftests/cgroup/lib/cgroup_util.c
> index 3ce134509041..9596f294da0b 100644
> --- a/tools/testing/selftests/cgroup/lib/cgroup_util.c
> +++ b/tools/testing/selftests/cgroup/lib/cgroup_util.c
> @@ -95,6 +95,8 @@ int cg_read(const char *cgroup, const char *control, char *buf, size_t len)
>
> snprintf(path, sizeof(path), "%s/%s", cgroup, control);
>
> + sleep(2);
> +
> ret = read_text(path, buf, len);
> return ret >= 0 ? 0 : ret;
> }
>
> I have no idea how to "fix" it properly. Please have a look!
We were discussing a way for userspace to explicitly trigger a flush
before, which would come in handy for testing. However, we decided not
to expose flushing as a concept to userspace.
Unfortunately I think the only way to "fix" the test is to allocate
more memory, enough to trigger a flush on most interesting setups.
Perhaps we should scale the amount of memory with the number of CPUs
so that we don't have to keep playing whack-a-mole.