Add a pair of BPF progs, netpoll_release and netpoll_acquire to test that the respective bpf_netpoll_release and bpf_netpoll_acquire behave as expected and that the verifier has been configured to catch unreleased references. Signed-off-by: Mahe Tardy --- .../selftests/bpf/prog_tests/netpoll.c | 23 +++++++++ .../selftests/bpf/progs/netpoll_basic.c | 47 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/netpoll_basic.c diff --git a/tools/testing/selftests/bpf/prog_tests/netpoll.c b/tools/testing/selftests/bpf/prog_tests/netpoll.c index eac0378c426a..daea1068a739 100644 --- a/tools/testing/selftests/bpf/prog_tests/netpoll.c +++ b/tools/testing/selftests/bpf/prog_tests/netpoll.c @@ -7,15 +7,38 @@ #include "test_progs.h" #include "network_helpers.h" #include "netpoll_sanity.skel.h" +#include "netpoll_basic.skel.h" #define NS_TEST "netpoll_sanity_ns" #define NS_TEST_V6 "netpoll_sanity_ns_v6" +#define NS_BASIC_TEST "netpoll_basic_ns" #define DUMMY_DEV "dummy0" #define DUMMY_IP "10.0.0.1" #define REMOTE_IP "10.0.0.2" #define DUMMY_IP6 "fd00::1" #define REMOTE_IP6 "fd00::2" +void test_netpoll_basic(void) +{ + struct nstoken *nstoken = NULL; + + SYS(fail, "ip netns add %s", NS_BASIC_TEST); + SYS(fail, "ip -net %s link add %s type dummy", NS_BASIC_TEST, DUMMY_DEV); + SYS(fail, "ip -net %s addr add %s/24 dev %s", NS_BASIC_TEST, DUMMY_IP, DUMMY_DEV); + SYS(fail, "ip -net %s link set %s up", NS_BASIC_TEST, DUMMY_DEV); + + nstoken = open_netns(NS_BASIC_TEST); + if (!ASSERT_OK_PTR(nstoken, "open_netns")) + goto fail; + + RUN_TESTS(netpoll_basic); + +fail: + if (nstoken) + close_netns(nstoken); + SYS_NOFAIL("ip netns del %s &> /dev/null", NS_BASIC_TEST); +} + static void run_netpoll_test(const char *ns_name, const char *local_ip, const char *remote_ip, bool ipv6) { diff --git a/tools/testing/selftests/bpf/progs/netpoll_basic.c b/tools/testing/selftests/bpf/progs/netpoll_basic.c new file mode 100644 index 000000000000..2650e1e5410a --- /dev/null +++ b/tools/testing/selftests/bpf/progs/netpoll_basic.c @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2026 Isovalent. */ + +#include "vmlinux.h" +#include +#include "bpf_misc.h" +#include "errno.h" + +SEC("syscall") +__success __retval(0) +int netpoll_release(void *ctx) +{ + struct bpf_netpoll_opts opts = { .dev_name = "dummy0" }; + struct bpf_netpoll *bnp; + int err = 0; + + bnp = bpf_netpoll_create(&opts, sizeof(opts), &err); + if (!bnp) + return err; + + bpf_netpoll_release(bnp); + + return 0; +} + +SEC("syscall") +__failure __msg("Unreleased reference") +int netpoll_acquire(void *ctx) +{ + struct bpf_netpoll_opts opts = { .dev_name = "dummy0" }; + struct bpf_netpoll *bnp; + int err = 0; + + bnp = bpf_netpoll_create(&opts, sizeof(opts), &err); + if (!bnp) + return err; + + bnp = bpf_netpoll_acquire(bnp); + if (!bnp) + return -EINVAL; + + bpf_netpoll_release(bnp); + + return 0; +} + +char __license[] SEC("license") = "GPL"; -- 2.34.1