Add a selftest to confirm the kfunc bpf_ffs64() runs OK. ./tools/testing/selftests/bpf/test_progs -t bitops 12/1 bitops/bitops_ffs64:OK 12 bitops:OK Summary: 1/1 PASSED, 0 SKIPPED, 0 FAILED Signed-off-by: Leon Hwang <hffilwlqm@xxxxxxxxx> --- .../testing/selftests/bpf/prog_tests/bitops.c | 54 +++++++++++++++++++ tools/testing/selftests/bpf/progs/bitops.c | 21 ++++++++ 2 files changed, 75 insertions(+) create mode 100644 tools/testing/selftests/bpf/prog_tests/bitops.c create mode 100644 tools/testing/selftests/bpf/progs/bitops.c diff --git a/tools/testing/selftests/bpf/prog_tests/bitops.c b/tools/testing/selftests/bpf/prog_tests/bitops.c new file mode 100644 index 0000000000000..e4c68da626280 --- /dev/null +++ b/tools/testing/selftests/bpf/prog_tests/bitops.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright Leon Hwang */ + +#include <test_progs.h> + +/* test_ffs64 tests the generic kfunc bpf_ffs64(). + */ +static void test_ffs64(void) +{ + struct bpf_object *obj = NULL; + struct bpf_program *prog; + char buff[128] = {}; + int err, prog_fd; + + LIBBPF_OPTS(bpf_test_run_opts, topts, + .data_in = buff, + .data_size_in = sizeof(buff), + .repeat = 1, + ); + + err = bpf_prog_test_load("bitops.bpf.o", BPF_PROG_TYPE_SCHED_CLS, &obj, + &prog_fd); + if (!ASSERT_OK(err, "load obj")) + return; + + prog = bpf_object__find_program_by_name(obj, "tc_ffs64"); + if (!ASSERT_OK_PTR(prog, "find tc_ffs64")) + goto out; + +#define TEST_FFS(n) \ + do { \ + u64 __n = 1; \ + \ + *(u64 *)(void *) buff = (u64) (__n << n); \ + err = bpf_prog_test_run_opts(prog_fd, &topts); \ + ASSERT_OK(err, "run prog"); \ + ASSERT_EQ(topts.retval, n, "run prog"); \ + } while (0) + + TEST_FFS(0); + TEST_FFS(1); + TEST_FFS(31); + TEST_FFS(63); + +#undef TEST_FFS +out: + bpf_object__close(obj); +} + +void test_bitops(void) +{ + if (test__start_subtest("bitops_ffs64")) + test_ffs64(); +} diff --git a/tools/testing/selftests/bpf/progs/bitops.c b/tools/testing/selftests/bpf/progs/bitops.c new file mode 100644 index 0000000000000..0863d1392b3d4 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/bitops.c @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright Leon Hwang */ + +#include "vmlinux.h" +#include <bpf/bpf_helpers.h> + +unsigned long bpf_ffs64(u64 word) __ksym; + +SEC("tc") +int tc_ffs64(struct __sk_buff *skb) +{ + void *data_end = (void *)(long)skb->data_end; + u64 *data = (u64 *)(long)skb->data; + + if ((void *)(u64)(data + 1) > data_end) + return -1; + + return bpf_ffs64(*data); +} + +char _license[] SEC("license") = "GPL"; -- 2.42.1