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

selftests/bpf: Add access_inner_map selftest

Add a selftest that accesses a BPF_MAP_TYPE_ARRAY (at a nonzero index)
nested within a BPF_MAP_TYPE_HASH_OF_MAPS to flex a previously buggy
case.

Signed-off-by: Rhys Rustad-Elliott <me@rhysre.net>
Link: https://lore.kernel.org/r/20230602190110.47068-3-me@rhysre.net
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>

authored by

Rhys Rustad-Elliott and committed by
Martin KaFai Lau
1022b67b cba41bb7

+76
+31
tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <test_progs.h> 4 + 5 + #include "inner_array_lookup.skel.h" 6 + 7 + void test_inner_array_lookup(void) 8 + { 9 + int map1_fd, err; 10 + int key = 3; 11 + int val = 1; 12 + struct inner_array_lookup *skel; 13 + 14 + skel = inner_array_lookup__open_and_load(); 15 + if (!ASSERT_OK_PTR(skel, "open_load_skeleton")) 16 + return; 17 + 18 + err = inner_array_lookup__attach(skel); 19 + if (!ASSERT_OK(err, "skeleton_attach")) 20 + goto cleanup; 21 + 22 + map1_fd = bpf_map__fd(skel->maps.inner_map1); 23 + bpf_map_update_elem(map1_fd, &key, &val, 0); 24 + 25 + /* Probe should have set the element at index 3 to 2 */ 26 + bpf_map_lookup_elem(map1_fd, &key, &val); 27 + ASSERT_EQ(val, 2, "value_is_2"); 28 + 29 + cleanup: 30 + inner_array_lookup__destroy(skel); 31 + }
+45
tools/testing/selftests/bpf/progs/inner_array_lookup.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + 3 + #include <linux/bpf.h> 4 + #include <bpf/bpf_helpers.h> 5 + 6 + struct inner_map { 7 + __uint(type, BPF_MAP_TYPE_ARRAY); 8 + __uint(max_entries, 5); 9 + __type(key, int); 10 + __type(value, int); 11 + } inner_map1 SEC(".maps"); 12 + 13 + struct outer_map { 14 + __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS); 15 + __uint(max_entries, 3); 16 + __type(key, int); 17 + __array(values, struct inner_map); 18 + } outer_map1 SEC(".maps") = { 19 + .values = { 20 + [2] = &inner_map1, 21 + }, 22 + }; 23 + 24 + SEC("raw_tp/sys_enter") 25 + int handle__sys_enter(void *ctx) 26 + { 27 + int outer_key = 2, inner_key = 3; 28 + int *val; 29 + void *map; 30 + 31 + map = bpf_map_lookup_elem(&outer_map1, &outer_key); 32 + if (!map) 33 + return 1; 34 + 35 + val = bpf_map_lookup_elem(map, &inner_key); 36 + if (!val) 37 + return 1; 38 + 39 + if (*val == 1) 40 + *val = 2; 41 + 42 + return 0; 43 + } 44 + 45 + char _license[] SEC("license") = "GPL";