selftest/bpf: Add map_in_maps with BPF_MAP_TYPE_PERF_EVENT_ARRAY values
authorAndrey Grafin <conquistador@yandex-team.ru>
Wed, 17 Jan 2024 13:06:19 +0000 (16:06 +0300)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 23 Jan 2024 22:43:12 +0000 (14:43 -0800)
Check that bpf_object__load() successfully creates map_in_maps
with BPF_MAP_TYPE_PERF_EVENT_ARRAY values.
These changes cover fix in the previous patch
"libbpf: Apply map_set_def_max_entries() for inner_maps on creation".

A command line output is:
- w/o fix
$ sudo ./test_maps
libbpf: map 'mim_array_pe': failed to create inner map: -22
libbpf: map 'mim_array_pe': failed to create: Invalid argument(-22)
libbpf: failed to load object './test_map_in_map.bpf.o'
Failed to load test prog

- with fix
$ sudo ./test_maps
...
test_maps: OK, 0 SKIPPED

Fixes: 646f02ffdd49 ("libbpf: Add BTF-defined map-in-map support")
Signed-off-by: Andrey Grafin <conquistador@yandex-team.ru>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Acked-by: Hou Tao <houtao1@huawei.com>
Link: https://lore.kernel.org/bpf/20240117130619.9403-2-conquistador@yandex-team.ru
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/progs/test_map_in_map.c
tools/testing/selftests/bpf/test_maps.c

index f416032ba858b48e4fba79dd1d629bd268eb13f5..b295f9b721bf89a08067592d46b91ed8c1956c6f 100644 (file)
@@ -21,6 +21,32 @@ struct {
        __type(value, __u32);
 } mim_hash SEC(".maps");
 
+/* The following three maps are used to test
+ * perf_event_array map can be an inner
+ * map of hash/array_of_maps.
+ */
+struct perf_event_array {
+       __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
+       __type(key, __u32);
+       __type(value, __u32);
+} inner_map0 SEC(".maps");
+
+struct {
+       __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
+       __uint(max_entries, 1);
+       __type(key, __u32);
+       __array(values, struct perf_event_array);
+} mim_array_pe SEC(".maps") = {
+       .values = {&inner_map0}};
+
+struct {
+       __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);
+       __uint(max_entries, 1);
+       __type(key, __u32);
+       __array(values, struct perf_event_array);
+} mim_hash_pe SEC(".maps") = {
+       .values = {&inner_map0}};
+
 SEC("xdp")
 int xdp_mimtest0(struct xdp_md *ctx)
 {
index 767e0693df1063239531974bbfb8ea8d848560e4..dfbab214f4d1c9a4adc9cdc206b88649f0f1730d 100644 (file)
@@ -1190,7 +1190,11 @@ static void test_map_in_map(void)
                goto out_map_in_map;
        }
 
-       bpf_object__load(obj);
+       err = bpf_object__load(obj);
+       if (err) {
+               printf("Failed to load test prog\n");
+               goto out_map_in_map;
+       }
 
        map = bpf_object__find_map_by_name(obj, "mim_array");
        if (!map) {