Add static maps to linked_maps selftests, validating that static maps with the same name can co-exists in separate files and local references to such maps are resolved correctly within each individual file. Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> --- .../selftests/bpf/prog_tests/linked_maps.c | 20 ++++++++++++++++++- .../selftests/bpf/progs/linked_maps1.c | 13 ++++++++++++ .../selftests/bpf/progs/linked_maps2.c | 18 +++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/bpf/prog_tests/linked_maps.c b/tools/testing/selftests/bpf/prog_tests/linked_maps.c index 85dcaaaf2775..6f51dae65b44 100644 --- a/tools/testing/selftests/bpf/prog_tests/linked_maps.c +++ b/tools/testing/selftests/bpf/prog_tests/linked_maps.c @@ -7,13 +7,21 @@ void test_linked_maps(void) { - int err; + int key1 = 1, key2 = 2; + int val1 = 42, val2 = 24, val; + int err, map_fd1, map_fd2; struct linked_maps *skel; skel = linked_maps__open_and_load(); if (!ASSERT_OK_PTR(skel, "skel_open")) return; + map_fd1 = bpf_map__fd(skel->maps.linked_maps1__map_static); + ASSERT_OK(bpf_map_update_elem(map_fd1, &key2, &val2, 0), "static_map1_update"); + + map_fd2 = bpf_map__fd(skel->maps.linked_maps2__map_static); + ASSERT_OK(bpf_map_update_elem(map_fd2, &key1, &val1, 0), "static_map2_update"); + err = linked_maps__attach(skel); if (!ASSERT_OK(err, "skel_attach")) goto cleanup; @@ -24,6 +32,16 @@ void test_linked_maps(void) ASSERT_EQ(skel->bss->output_first1, 2000, "output_first1"); ASSERT_EQ(skel->bss->output_second1, 2, "output_second1"); ASSERT_EQ(skel->bss->output_weak1, 2, "output_weak1"); + ASSERT_EQ(skel->bss->output_static1, val2, "output_static1"); + ASSERT_OK(bpf_map_lookup_elem(map_fd1, &key1, &val), "static_map1_lookup"); + ASSERT_EQ(val, 1, "static_map1_key1"); + + ASSERT_EQ(skel->bss->output_first2, 1000, "output_first2"); + ASSERT_EQ(skel->bss->output_second2, 1, "output_second2"); + ASSERT_EQ(skel->bss->output_weak2, 1, "output_weak2"); + ASSERT_EQ(skel->bss->output_static2, val1, "output_static2"); + ASSERT_OK(bpf_map_lookup_elem(map_fd2, &key2, &val), "static_map2_lookup"); + ASSERT_EQ(val, 2, "static_map2_key2"); cleanup: linked_maps__destroy(skel); diff --git a/tools/testing/selftests/bpf/progs/linked_maps1.c b/tools/testing/selftests/bpf/progs/linked_maps1.c index 2f4bab565e64..5644949d63f8 100644 --- a/tools/testing/selftests/bpf/progs/linked_maps1.c +++ b/tools/testing/selftests/bpf/progs/linked_maps1.c @@ -37,9 +37,17 @@ struct { __uint(max_entries, 16); } map_weak __weak SEC(".maps"); +static struct { + __uint(type, BPF_MAP_TYPE_HASH); + __type(key, int); + __type(value, int); + __uint(max_entries, 4); +} map_static SEC(".maps"); + int output_first1 = 0; int output_second1 = 0; int output_weak1 = 0; +int output_static1 = 0; SEC("raw_tp/sys_enter") int BPF_PROG(handler_enter1) @@ -52,6 +60,7 @@ int BPF_PROG(handler_enter1) bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); bpf_map_update_elem(&map2, &key, &val, 0); bpf_map_update_elem(&map_weak, &key, &val, 0); + bpf_map_update_elem(&map_static, &key, &val, 0); return 0; } @@ -76,6 +85,10 @@ int BPF_PROG(handler_exit1) if (val) output_weak1 = *val; + val = bpf_map_lookup_elem(&map_static, &key); + if (val) + output_static1 = *val; + return 0; } diff --git a/tools/testing/selftests/bpf/progs/linked_maps2.c b/tools/testing/selftests/bpf/progs/linked_maps2.c index 3f1490ea8f37..2b9e11ac0335 100644 --- a/tools/testing/selftests/bpf/progs/linked_maps2.c +++ b/tools/testing/selftests/bpf/progs/linked_maps2.c @@ -31,9 +31,22 @@ struct { __uint(max_entries, 16); } map_weak __weak SEC(".maps"); +static struct { + /* different type */ + __uint(type, BPF_MAP_TYPE_ARRAY); + /* key and value are kept int for convenience, they don't have to + * match with map_static in linked_maps1 + */ + __type(key, int); + __type(value, int); + /* different max_entries */ + __uint(max_entries, 20); +} map_static SEC(".maps"); + int output_first2 = 0; int output_second2 = 0; int output_weak2 = 0; +int output_static2 = 0; SEC("raw_tp/sys_enter") int BPF_PROG(handler_enter2) @@ -46,6 +59,7 @@ int BPF_PROG(handler_enter2) bpf_map_update_elem(&map1, &key_struct, &val_struct, 0); bpf_map_update_elem(&map2, &key, &val, 0); bpf_map_update_elem(&map_weak, &key, &val, 0); + bpf_map_update_elem(&map_static, &key, &val, 0); return 0; } @@ -70,6 +84,10 @@ int BPF_PROG(handler_exit2) if (val) output_weak2 = *val; + val = bpf_map_lookup_elem(&map_static, &key); + if (val) + output_static2 = *val; + return 0; } -- 2.30.2