Test BPF map creation using BTF-defined key/value. The test defines some specialized maps by specifying BTF types for key/value and checks those maps are correctly initialized and loaded. Signed-off-by: Hengqi Chen <hengqi.chen@xxxxxxxxx> --- .../selftests/bpf/prog_tests/map_create.c | 87 ++++++++++++++ .../selftests/bpf/progs/test_map_create.c | 110 ++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/map_create.c create mode 100644 tools/testing/selftests/bpf/progs/test_map_create.c diff --git a/tools/testing/selftests/bpf/prog_tests/map_create.c b/tools/testing/selftests/bpf/prog_tests/map_create.c new file mode 100644 index 000000000000..6ca32d0dffd2 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/map_create.c @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2021 Hengqi Chen */ + +#include <test_progs.h> +#include "test_map_create.skel.h" + +void test_map_create(void) +{ + struct test_map_create *skel; + int err, fd; + + skel = test_map_create__open(); + if (!ASSERT_OK_PTR(skel, "test_map_create__open failed")) + return; + + err = test_map_create__load(skel); + if (!ASSERT_OK(err, "test_map_create__load failed")) + goto cleanup; + + fd = bpf_map__fd(skel->maps.map1); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map2); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map3); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map4); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map5); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map6); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map7); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map8); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map9); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map10); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map11); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map12); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + + fd = bpf_map__fd(skel->maps.map13); + if (!ASSERT_GT(fd, 0, "bpf_map__fd failed")) + goto cleanup; + close(fd); + +cleanup: + test_map_create__destroy(skel); +} diff --git a/tools/testing/selftests/bpf/progs/test_map_create.c b/tools/testing/selftests/bpf/progs/test_map_create.c new file mode 100644 index 000000000000..2e9950e56b0f --- /dev/null +++ b/tools/testing/selftests/bpf/progs/test_map_create.c @@ -0,0 +1,110 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2021 Hengqi Chen */ + +#include "vmlinux.h" +#include <bpf/bpf_helpers.h> + +#define MAX_ENTRIES 8 + +struct { + __uint(type,BPF_MAP_TYPE_PERF_EVENT_ARRAY); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map1 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK_TRACE); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, __u64); +} map2 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map3 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); + __array(values, struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, __u32); + __type(value, __u32); + }); +} map4 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_HASH_OF_MAPS); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); + __array(values, struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, __u32); + __type(value, __u32); + }); +} map5 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_DEVMAP); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map6 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_SOCKMAP); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map7 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_CPUMAP); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map8 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_XSKMAP); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map9 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_SOCKHASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map10 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_QUEUE); + __uint(max_entries, MAX_ENTRIES); + __type(value, int); +} map11 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_STACK); + __uint(max_entries, MAX_ENTRIES); + __type(value, int); +} map12 SEC(".maps"); + +struct { + __uint(type, BPF_MAP_TYPE_DEVMAP_HASH); + __uint(max_entries, MAX_ENTRIES); + __type(key, int); + __type(value, int); +} map13 SEC(".maps"); + +char _license[] SEC("license") = "GPL"; -- 2.25.1