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

selftests/bpf: Add tests for bpf_object__prepare

Add selftests, checking that running bpf_object__prepare successfully
creates maps before load step.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20250303135752.158343-5-mykyta.yatsenko5@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Mykyta Yatsenko and committed by
Alexei Starovoitov
6419d08b 1315c28e

+127
+99
tools/testing/selftests/bpf/prog_tests/prepare.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* Copyright (c) 2025 Meta */ 3 + 4 + #include <test_progs.h> 5 + #include <network_helpers.h> 6 + #include "prepare.skel.h" 7 + 8 + static bool check_prepared(struct bpf_object *obj) 9 + { 10 + bool is_prepared = true; 11 + const struct bpf_map *map; 12 + 13 + bpf_object__for_each_map(map, obj) { 14 + if (bpf_map__fd(map) < 0) 15 + is_prepared = false; 16 + } 17 + 18 + return is_prepared; 19 + } 20 + 21 + static void test_prepare_no_load(void) 22 + { 23 + struct prepare *skel; 24 + int err; 25 + LIBBPF_OPTS(bpf_test_run_opts, topts, 26 + .data_in = &pkt_v4, 27 + .data_size_in = sizeof(pkt_v4), 28 + ); 29 + 30 + skel = prepare__open(); 31 + if (!ASSERT_OK_PTR(skel, "prepare__open")) 32 + return; 33 + 34 + if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared")) 35 + goto cleanup; 36 + 37 + err = bpf_object__prepare(skel->obj); 38 + 39 + if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared")) 40 + goto cleanup; 41 + 42 + if (!ASSERT_OK(err, "bpf_object__prepare")) 43 + goto cleanup; 44 + 45 + cleanup: 46 + prepare__destroy(skel); 47 + } 48 + 49 + static void test_prepare_load(void) 50 + { 51 + struct prepare *skel; 52 + int err, prog_fd; 53 + LIBBPF_OPTS(bpf_test_run_opts, topts, 54 + .data_in = &pkt_v4, 55 + .data_size_in = sizeof(pkt_v4), 56 + ); 57 + 58 + skel = prepare__open(); 59 + if (!ASSERT_OK_PTR(skel, "prepare__open")) 60 + return; 61 + 62 + if (!ASSERT_FALSE(check_prepared(skel->obj), "not check_prepared")) 63 + goto cleanup; 64 + 65 + err = bpf_object__prepare(skel->obj); 66 + if (!ASSERT_OK(err, "bpf_object__prepare")) 67 + goto cleanup; 68 + 69 + err = prepare__load(skel); 70 + if (!ASSERT_OK(err, "prepare__load")) 71 + goto cleanup; 72 + 73 + if (!ASSERT_TRUE(check_prepared(skel->obj), "check_prepared")) 74 + goto cleanup; 75 + 76 + prog_fd = bpf_program__fd(skel->progs.program); 77 + if (!ASSERT_GE(prog_fd, 0, "prog_fd")) 78 + goto cleanup; 79 + 80 + err = bpf_prog_test_run_opts(prog_fd, &topts); 81 + if (!ASSERT_OK(err, "test_run_opts err")) 82 + goto cleanup; 83 + 84 + if (!ASSERT_OK(topts.retval, "test_run_opts retval")) 85 + goto cleanup; 86 + 87 + ASSERT_EQ(skel->bss->err, 0, "err"); 88 + 89 + cleanup: 90 + prepare__destroy(skel); 91 + } 92 + 93 + void test_prepare(void) 94 + { 95 + if (test__start_subtest("prepare_load")) 96 + test_prepare_load(); 97 + if (test__start_subtest("prepare_no_load")) 98 + test_prepare_no_load(); 99 + }
+28
tools/testing/selftests/bpf/progs/prepare.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* Copyright (c) 2025 Meta */ 3 + #include <vmlinux.h> 4 + #include <bpf/bpf_helpers.h> 5 + //#include <bpf/bpf_tracing.h> 6 + 7 + char _license[] SEC("license") = "GPL"; 8 + 9 + int err; 10 + 11 + struct { 12 + __uint(type, BPF_MAP_TYPE_RINGBUF); 13 + __uint(max_entries, 4096); 14 + } ringbuf SEC(".maps"); 15 + 16 + struct { 17 + __uint(type, BPF_MAP_TYPE_ARRAY); 18 + __uint(max_entries, 1); 19 + __type(key, __u32); 20 + __type(value, __u32); 21 + } array_map SEC(".maps"); 22 + 23 + SEC("cgroup_skb/egress") 24 + int program(struct __sk_buff *skb) 25 + { 26 + err = 0; 27 + return 0; 28 + }