Fix test_cgroup_iter_memcg issues found during back-porting
Subsystems (3)
v5 cover Fix test_cgroup_iter_memcg issues found during back-porting
From: Hui Zhu <[email protected]>
While back-porting "mm: bpf kfuncs to access memcg data", I encountered issues with test_cgroup_iter_memcg, specifically in test_kmem.
The test_cgroup_iter_memcg test would falsely pass when bpf_mem_cgroup_page_state() failed due to incompatible enum values across kernel versions. Additionally, test_kmem would fail on systems with cgroup.memory=nokmem enabled.
These patches are my fixes for the problems I encountered.
Changelog:
v5:
According to the comments of Emil Tsalapatis and JP Kobryn, dropped "selftests/bpf: Check bpf_mem_cgroup_page_state return value". v4:
Fixed wrong git commit log in "bpf: Use bpf_core_enum_value for stats in cgroup_iter_memcg".
v3:
According to the comments of JP Kobryn, remove kmem subtest from cgroup_iter_memcg and fix assertion string in test_pgfault. v2:
According to the comments of JP Kobryn, added bpf_core_enum_value() usage in the BPF program to handle cross-kernel enum value differences at load-time instead of compile-time.
Dropped the mm/memcontrol.c patch.
Modified test_kmem handling: instead of skipping when nokmem is set, verify that kmem value is zero as expected.
According to the comments of bot, fixed assertion message: changed "bpf_mem_cgroup_page_state" to "bpf_mem_cgroup_vm_events" for PGFAULT check.
Hui Zhu (2):
selftests/bpf: Remove kmem subtest from cgroup_iter_memcg
bpf: Use bpf_core_enum_value for stats in cgroup_iter_memcg
.../testing/selftests/bpf/cgroup_iter_memcg.h | 2 -- .../bpf/prog_tests/cgroup_iter_memcg.c | 28 ------------------- .../selftests/bpf/progs/cgroup_iter_memcg.c | 18 ++++++++---- 3 files changed, 12 insertions(+), 36 deletions(-)
Signature · 1 line
2.43.0
PATCH v5 1/2 selftests/bpf: Remove kmem subtest from cgroup_iter_memcg
From: Hui Zhu <[email protected]>
When cgroup.memory=nokmem is set in the kernel command line, kmem accounting is disabled. This causes the test_kmem subtest in cgroup_iter_memcg to fail because it expects non-zero kmem values.
Remove the kmem subtest altogether since the remaining subtests (shmem, file, pgfault) already provide sufficient coverage for the cgroup iter memcg functionality.
--- .../testing/selftests/bpf/cgroup_iter_memcg.h | 2 -- .../bpf/prog_tests/cgroup_iter_memcg.c | 28 ------------------- .../selftests/bpf/progs/cgroup_iter_memcg.c | 1 - 3 files changed, 31 deletions(-)
tools/testing/selftests/bpf/cgroup_iter_memcg.h +0 -2
@@ -9,8 +9,6 @@ struct memcg_query {unsigned long nr_shmem;unsigned long nr_file_pages;unsigned long nr_file_mapped; -/* some memcg_stat_item */ -unsigned long memcg_kmem;/* some vm_event_item */ unsigned long pgfault; };
tools/testing/selftests/bpf/prog_tests/cgroup_iter_memcg.c +0 -28
@@ -126,32 +126,6 @@ static void test_shmem(struct bpf_link *link, struct memcg_query *memcg_query)shm_unlink ("/tmp_shmem" ); } -#define NR_PIPES 64 -static void test_kmem (struct bpf_link *link,struct memcg_query *memcg_query) -{ -int fds[NR_PIPES ][2 ], i; - -/* -* Increase kmem value by creating pipes which will allocate some -* kernel buffers. -*/ -for (i =0 ; i <NR_PIPES ; i++) { -if (!ASSERT_OK (pipe (fds[i]),"pipe" )) - goto cleanup; - } - -if (!ASSERT_OK (read_stats (link),"read stats" )) - goto cleanup; - -ASSERT_GT (memcg_query->memcg_kmem,0 ,"kmem value" ); - -cleanup: -for (i = i -1 ; i >=0 ; i--) { -close (fds[i][0 ]); -close (fds[i][1 ]); - } -} -static void test_pgfault (struct bpf_link *link,struct memcg_query *memcg_query) {void *map;
@@ -209,8 +183,6 @@ void test_cgroup_iter_memcg(void)test_shmem (link, &skel->data_query->memcg_query);if (test__start_subtest ("cgroup_iter_memcg__file" ))test_file (link, &skel->data_query->memcg_query); -if (test__start_subtest ("cgroup_iter_memcg__kmem" )) -test_kmem (link, &skel->data_query->memcg_query);if (test__start_subtest ("cgroup_iter_memcg__pgfault" ))test_pgfault (link, &skel->data_query->memcg_query);
tools/testing/selftests/bpf/progs/cgroup_iter_memcg.c +0 -1
@@ -30,7 +30,6 @@ int cgroup_memcg_query(struct bpf_iter__cgroup *ctx) memcg_query.nr_shmem =bpf_mem_cgroup_page_state (memcg,NR_SHMEM ); memcg_query.nr_file_pages =bpf_mem_cgroup_page_state (memcg,NR_FILE_PAGES ); memcg_query.nr_file_mapped =bpf_mem_cgroup_page_state (memcg,NR_FILE_MAPPED ); - memcg_query.memcg_kmem =bpf_mem_cgroup_page_state (memcg,MEMCG_KMEM ); memcg_query.pgfault =bpf_mem_cgroup_vm_events (memcg,PGFAULT );bpf_put_mem_cgroup (memcg);
Signature · 1 line
2.43.0
PATCH v5 2/2 bpf: Use bpf_core_enum_value for stats in cgroup_iter_memcg
In reply to Hui ZhuFrom: Hui Zhu <[email protected]>
Replace hardcoded enum values with bpf_core_enum_value() calls in cgroup_iter_memcg test to improve portability across different kernel versions.
The change adds runtime enum value resolution for:
- node_stat_item: NR_ANON_MAPPED, NR_SHMEM, NR_FILE_PAGES, NR_FILE_MAPPED
- vm_event_item: PGFAULT
This ensures the BPF program can adapt to enum value changes between kernel versions.
--- .../selftests/bpf/progs/cgroup_iter_memcg.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/progs/cgroup_iter_memcg.c +12 -5
@@ -26,11 +26,18 @@ int cgroup_memcg_query(struct bpf_iter__cgroup *ctx)bpf_mem_cgroup_flush_stats (memcg); - memcg_query.nr_anon_mapped =bpf_mem_cgroup_page_state (memcg,NR_ANON_MAPPED ); - memcg_query.nr_shmem =bpf_mem_cgroup_page_state (memcg,NR_SHMEM ); - memcg_query.nr_file_pages =bpf_mem_cgroup_page_state (memcg,NR_FILE_PAGES ); - memcg_query.nr_file_mapped =bpf_mem_cgroup_page_state (memcg,NR_FILE_MAPPED ); - memcg_query.pgfault =bpf_mem_cgroup_vm_events (memcg,PGFAULT ); + memcg_query.nr_anon_mapped =bpf_mem_cgroup_page_state ( + memcg, + bpf_core_enum_value(enum node_stat_item, NR_ANON_MAPPED)); + memcg_query.nr_shmem =bpf_mem_cgroup_page_state ( + memcg, bpf_core_enum_value(enum node_stat_item, NR_SHMEM)); + memcg_query.nr_file_pages =bpf_mem_cgroup_page_state ( + memcg, bpf_core_enum_value(enum node_stat_item, NR_FILE_PAGES)); + memcg_query.nr_file_mapped =bpf_mem_cgroup_page_state ( + memcg, + bpf_core_enum_value(enum node_stat_item, NR_FILE_MAPPED)); + memcg_query.pgfault =bpf_mem_cgroup_vm_events ( + memcg, bpf_core_enum_value(enum vm_event_item, PGFAULT));bpf_put_mem_cgroup (memcg);
Signature · 1 line
2.43.0
This series was applied to bpf/bpf-next.git (master) by Alexei Starovoitov <[email protected]>:
Hello:
This series was applied to bpf/bpf-next.git (master) by Alexei Starovoitov <[email protected]>:
Quoted 11 lines · On Tue, 3 Mar 2026 13:53:07 +0800 you wrote:
From: Hui Zhu <[email protected]>
While back-porting "mm: bpf kfuncs to access memcg data", I encountered issues with
test_cgroup_iter_memcg, specifically intest_kmem.
Thetest_cgroup_iter_memcgtest would falsely pass whenbpf_mem_cgroup_page_state()failed due to incompatible enum values across kernel versions. Additionally,test_kmemwould fail on systems with cgroup.memory=nokmem enabled.[...]
Here is the summary with links:
- [bpf-next,v5,1/2] selftests/bpf: Remove kmem subtest from cgroup_iter_memcg
https://git.kernel.org/bpf/bpf-next/c/a8fce027e17b - [bpf-next,v5,2/2] bpf: Use bpf_core_enum_value for stats in cgroup_iter_memcg https://git.kernel.org/bpf/bpf-next/c/da99028c2113
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html