Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'fix-test_cgroup_iter_memcg-issues-found-during-back-porting'

Hui Zhu says:

====================
Fix test_cgroup_iter_memcg issues found during back-porting

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.
====================

Link: https://patch.msgid.link/cover.1772505399.git.zhuhui@kylinos.cn
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

+12 -36
-2
tools/testing/selftests/bpf/cgroup_iter_memcg.h
··· 9 9 unsigned long nr_shmem; 10 10 unsigned long nr_file_pages; 11 11 unsigned long nr_file_mapped; 12 - /* some memcg_stat_item */ 13 - unsigned long memcg_kmem; 14 12 /* some vm_event_item */ 15 13 unsigned long pgfault; 16 14 };
-28
tools/testing/selftests/bpf/prog_tests/cgroup_iter_memcg.c
··· 126 126 shm_unlink("/tmp_shmem"); 127 127 } 128 128 129 - #define NR_PIPES 64 130 - static void test_kmem(struct bpf_link *link, struct memcg_query *memcg_query) 131 - { 132 - int fds[NR_PIPES][2], i; 133 - 134 - /* 135 - * Increase kmem value by creating pipes which will allocate some 136 - * kernel buffers. 137 - */ 138 - for (i = 0; i < NR_PIPES; i++) { 139 - if (!ASSERT_OK(pipe(fds[i]), "pipe")) 140 - goto cleanup; 141 - } 142 - 143 - if (!ASSERT_OK(read_stats(link), "read stats")) 144 - goto cleanup; 145 - 146 - ASSERT_GT(memcg_query->memcg_kmem, 0, "kmem value"); 147 - 148 - cleanup: 149 - for (i = i - 1; i >= 0; i--) { 150 - close(fds[i][0]); 151 - close(fds[i][1]); 152 - } 153 - } 154 - 155 129 static void test_pgfault(struct bpf_link *link, struct memcg_query *memcg_query) 156 130 { 157 131 void *map; ··· 183 209 test_shmem(link, &skel->data_query->memcg_query); 184 210 if (test__start_subtest("cgroup_iter_memcg__file")) 185 211 test_file(link, &skel->data_query->memcg_query); 186 - if (test__start_subtest("cgroup_iter_memcg__kmem")) 187 - test_kmem(link, &skel->data_query->memcg_query); 188 212 if (test__start_subtest("cgroup_iter_memcg__pgfault")) 189 213 test_pgfault(link, &skel->data_query->memcg_query); 190 214
+12 -6
tools/testing/selftests/bpf/progs/cgroup_iter_memcg.c
··· 26 26 27 27 bpf_mem_cgroup_flush_stats(memcg); 28 28 29 - memcg_query.nr_anon_mapped = bpf_mem_cgroup_page_state(memcg, NR_ANON_MAPPED); 30 - memcg_query.nr_shmem = bpf_mem_cgroup_page_state(memcg, NR_SHMEM); 31 - memcg_query.nr_file_pages = bpf_mem_cgroup_page_state(memcg, NR_FILE_PAGES); 32 - memcg_query.nr_file_mapped = bpf_mem_cgroup_page_state(memcg, NR_FILE_MAPPED); 33 - memcg_query.memcg_kmem = bpf_mem_cgroup_page_state(memcg, MEMCG_KMEM); 34 - memcg_query.pgfault = bpf_mem_cgroup_vm_events(memcg, PGFAULT); 29 + memcg_query.nr_anon_mapped = bpf_mem_cgroup_page_state( 30 + memcg, 31 + bpf_core_enum_value(enum node_stat_item, NR_ANON_MAPPED)); 32 + memcg_query.nr_shmem = bpf_mem_cgroup_page_state( 33 + memcg, bpf_core_enum_value(enum node_stat_item, NR_SHMEM)); 34 + memcg_query.nr_file_pages = bpf_mem_cgroup_page_state( 35 + memcg, bpf_core_enum_value(enum node_stat_item, NR_FILE_PAGES)); 36 + memcg_query.nr_file_mapped = bpf_mem_cgroup_page_state( 37 + memcg, 38 + bpf_core_enum_value(enum node_stat_item, NR_FILE_MAPPED)); 39 + memcg_query.pgfault = bpf_mem_cgroup_vm_events( 40 + memcg, bpf_core_enum_value(enum vm_event_item, PGFAULT)); 35 41 36 42 bpf_put_mem_cgroup(memcg); 37 43