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

selftest/bpf: Switch recursion test to use htab_map_delete_elem

Currently the recursion test is hooking __htab_map_lookup_elem
function, which is invoked both from bpf_prog and bpf syscall.

But in our kernel build, the __htab_map_lookup_elem gets inlined
within the htab_map_lookup_elem, so it's not trigered and the
test fails.

Fixing this by using htab_map_delete_elem, which is not inlined
for bpf_prog calls (like htab_map_lookup_elem is) and is used
directly as pointer for map_delete_elem, so it won't disappear
by inlining.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Link: https://lore.kernel.org/bpf/YVnfFTL/3T6jOwHI@krava

authored by

Jiri Olsa and committed by
Andrii Nakryiko
189c83bd 929bef46

+8 -11
+5 -5
tools/testing/selftests/bpf/prog_tests/recursion.c
··· 20 20 goto out; 21 21 22 22 ASSERT_EQ(skel->bss->pass1, 0, "pass1 == 0"); 23 - bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash1), &key, 0); 23 + bpf_map_delete_elem(bpf_map__fd(skel->maps.hash1), &key); 24 24 ASSERT_EQ(skel->bss->pass1, 1, "pass1 == 1"); 25 - bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash1), &key, 0); 25 + bpf_map_delete_elem(bpf_map__fd(skel->maps.hash1), &key); 26 26 ASSERT_EQ(skel->bss->pass1, 2, "pass1 == 2"); 27 27 28 28 ASSERT_EQ(skel->bss->pass2, 0, "pass2 == 0"); 29 - bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash2), &key, 0); 29 + bpf_map_delete_elem(bpf_map__fd(skel->maps.hash2), &key); 30 30 ASSERT_EQ(skel->bss->pass2, 1, "pass2 == 1"); 31 - bpf_map_lookup_elem(bpf_map__fd(skel->maps.hash2), &key, 0); 31 + bpf_map_delete_elem(bpf_map__fd(skel->maps.hash2), &key); 32 32 ASSERT_EQ(skel->bss->pass2, 2, "pass2 == 2"); 33 33 34 - err = bpf_obj_get_info_by_fd(bpf_program__fd(skel->progs.on_lookup), 34 + err = bpf_obj_get_info_by_fd(bpf_program__fd(skel->progs.on_delete), 35 35 &prog_info, &prog_info_len); 36 36 if (!ASSERT_OK(err, "get_prog_info")) 37 37 goto out;
+3 -6
tools/testing/selftests/bpf/progs/recursion.c
··· 24 24 int pass1 = 0; 25 25 int pass2 = 0; 26 26 27 - SEC("fentry/__htab_map_lookup_elem") 28 - int BPF_PROG(on_lookup, struct bpf_map *map) 27 + SEC("fentry/htab_map_delete_elem") 28 + int BPF_PROG(on_delete, struct bpf_map *map) 29 29 { 30 30 int key = 0; 31 31 ··· 35 35 } 36 36 if (map == (void *)&hash2) { 37 37 pass2++; 38 - /* htab_map_gen_lookup() will inline below call 39 - * into direct call to __htab_map_lookup_elem() 40 - */ 41 - bpf_map_lookup_elem(&hash2, &key); 38 + bpf_map_delete_elem(&hash2, &key); 42 39 return 0; 43 40 } 44 41