Message ID | 20230602190110.47068-3-me@rhysre.net (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | BPF |
Headers | show |
Series | Fix elem_size not being set for inner maps | expand |
On 6/2/23 12:02 PM, Rhys Rustad-Elliott wrote: > 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> > --- > .../bpf/prog_tests/inner_array_lookup.c | 31 +++++++++++++ > .../bpf/progs/test_inner_array_lookup.c | 45 +++++++++++++++++++ > 2 files changed, 76 insertions(+) > create mode 100644 tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c > create mode 100644 tools/testing/selftests/bpf/progs/test_inner_array_lookup.c > > diff --git a/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c b/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c > new file mode 100644 > index 000000000000..29d4d0067c60 > --- /dev/null > +++ b/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c > @@ -0,0 +1,31 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include <test_progs.h> > + > +#include "test_inner_array_lookup.skel.h" > + > +void test_inner_array_lookup(void) > +{ > + int map1_fd, err; > + int key = 3; > + int val = 1; > + struct test_inner_array_lookup *skel; > + > + skel = test_inner_array_lookup__open_and_load(); > + if (!ASSERT_TRUE(skel != NULL, "open_load_skeleton")) Changed to ASSERT_OK_PTR. Similar changes to the ASSERT_TRUE below. > + return; > + > + err = test_inner_array_lookup__attach(skel); > + if (!ASSERT_TRUE(err == 0, "skeleton_attach")) > + goto cleanup; > + > + map1_fd = bpf_map__fd(skel->maps.inner_map1); > + bpf_map_update_elem(map1_fd, &key, &val, 0); > + > + /* Probe should have set the element at index 3 to 2 */ > + bpf_map_lookup_elem(map1_fd, &key, &val); > + ASSERT_TRUE(val == 2, "value_is_2"); > + > +cleanup: > + test_inner_array_lookup__destroy(skel); > +} > diff --git a/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c b/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c > new file mode 100644 > index 000000000000..c2c8f2fa451d > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c Removed 'test_' from the filename, already mentioned in v1. Applied. Thanks for the fix.
diff --git a/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c b/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c new file mode 100644 index 000000000000..29d4d0067c60 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <test_progs.h> + +#include "test_inner_array_lookup.skel.h" + +void test_inner_array_lookup(void) +{ + int map1_fd, err; + int key = 3; + int val = 1; + struct test_inner_array_lookup *skel; + + skel = test_inner_array_lookup__open_and_load(); + if (!ASSERT_TRUE(skel != NULL, "open_load_skeleton")) + return; + + err = test_inner_array_lookup__attach(skel); + if (!ASSERT_TRUE(err == 0, "skeleton_attach")) + goto cleanup; + + map1_fd = bpf_map__fd(skel->maps.inner_map1); + bpf_map_update_elem(map1_fd, &key, &val, 0); + + /* Probe should have set the element at index 3 to 2 */ + bpf_map_lookup_elem(map1_fd, &key, &val); + ASSERT_TRUE(val == 2, "value_is_2"); + +cleanup: + test_inner_array_lookup__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c b/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c new file mode 100644 index 000000000000..c2c8f2fa451d --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_inner_array_lookup.c @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +struct inner_map { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 5); + __type(key, int); + __type(value, int); +} inner_map1 SEC(".maps"); + +struct outer_map { + __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS); + __uint(max_entries, 3); + __type(key, int); + __array(values, struct inner_map); +} outer_map1 SEC(".maps") = { + .values = { + [2] = &inner_map1, + }, +}; + +SEC("raw_tp/sys_enter") +int handle__sys_enter(void *ctx) +{ + int outer_key = 2, inner_key = 3; + int *val; + void *map; + + map = bpf_map_lookup_elem(&outer_map1, &outer_key); + if (!map) + return 1; + + val = bpf_map_lookup_elem(map, &inner_key); + if (!val) + return 1; + + if (*val == 1) + *val = 2; + + return 0; +} + +char _license[] SEC("license") = "GPL";
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> --- .../bpf/prog_tests/inner_array_lookup.c | 31 +++++++++++++ .../bpf/progs/test_inner_array_lookup.c | 45 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/inner_array_lookup.c create mode 100644 tools/testing/selftests/bpf/progs/test_inner_array_lookup.c