diff options
| author | Alexei Starovoitov <ast@kernel.org> | 2023-05-16 22:09:24 -0700 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2023-05-16 22:17:22 -0700 |
| commit | 0697e4394210b9f7d83c32c9236a47fdeddf9ac0 (patch) | |
| tree | 5de18157ce74b0dcb81aaf0be0090025270a7e5f /tools/testing/selftests/bpf/testing_helpers.c | |
| parent | de58ef414d8d7a0a635cd331b3b013d8216c4e60 (diff) | |
| parent | 65eb006d85a2ac0b23464808099726bd826e9877 (diff) | |
Merge branch 'bpf: Move kernel test kfuncs into bpf_testmod'
Jiri Olsa says:
====================
hi,
I noticed several times in discussions that we should move test kfuncs
into kernel module, now perhaps even more pressing with all the kfunc
effort. This patchset moves all the test kfuncs into bpf_testmod.
I added bpf_testmod/bpf_testmod_kfunc.h header that is shared between
bpf_testmod kernel module and BPF programs.
v4 changes:
- s390 supports long calls [1] now, so it can call now kfuncs from module [Ilya]
- added acks [David]
- cleanups for ptr_to_u64 function [David]
- use relative path for bpf_testmod_kfunc.h include [Andrii]
- new libbpf fix (patch 1) for gen_loader
v3 changes:
- added acks [David]
- added bpf_testmod.ko make dependency for bpf test progs [David]
- better handling of __ksym and refcount_t in bpf_testmod_kfunc.h [David]
- removed 'extern' from kfuncs declarations [David]
- typo in header guard macro [David]
- use only stdout in un/load_bpf_testmod
v2 changes:
- add 74bc3a5acc82 into bpf-next/master CI, so the test would pass
https://github.com/kernel-patches/vmtest/pull/192
- remove extra externs [Artem]
- using un/load_bpf_testmod in other tests
- rebased
thanks,
jirka
[1] 1cf3bfc60f98 bpf: Support 64-bit pointers to kfuncs
====================
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'tools/testing/selftests/bpf/testing_helpers.c')
| -rw-r--r-- | tools/testing/selftests/bpf/testing_helpers.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/testing_helpers.c b/tools/testing/selftests/bpf/testing_helpers.c index dc9595ade8de..8d994884c7b4 100644 --- a/tools/testing/selftests/bpf/testing_helpers.c +++ b/tools/testing/selftests/bpf/testing_helpers.c @@ -9,6 +9,7 @@ #include <bpf/libbpf.h> #include "test_progs.h" #include "testing_helpers.h" +#include <linux/membarrier.h> int parse_num_list(const char *s, bool **num_set, int *num_set_len) { @@ -326,3 +327,63 @@ __u64 read_perf_max_sample_freq(void) fclose(f); return sample_freq; } + +static int finit_module(int fd, const char *param_values, int flags) +{ + return syscall(__NR_finit_module, fd, param_values, flags); +} + +static int delete_module(const char *name, int flags) +{ + return syscall(__NR_delete_module, name, flags); +} + +int unload_bpf_testmod(bool verbose) +{ + if (kern_sync_rcu()) + fprintf(stdout, "Failed to trigger kernel-side RCU sync!\n"); + if (delete_module("bpf_testmod", 0)) { + if (errno == ENOENT) { + if (verbose) + fprintf(stdout, "bpf_testmod.ko is already unloaded.\n"); + return -1; + } + fprintf(stdout, "Failed to unload bpf_testmod.ko from kernel: %d\n", -errno); + return -1; + } + if (verbose) + fprintf(stdout, "Successfully unloaded bpf_testmod.ko.\n"); + return 0; +} + +int load_bpf_testmod(bool verbose) +{ + int fd; + + if (verbose) + fprintf(stdout, "Loading bpf_testmod.ko...\n"); + + fd = open("bpf_testmod.ko", O_RDONLY); + if (fd < 0) { + fprintf(stdout, "Can't find bpf_testmod.ko kernel module: %d\n", -errno); + return -ENOENT; + } + if (finit_module(fd, "", 0)) { + fprintf(stdout, "Failed to load bpf_testmod.ko into the kernel: %d\n", -errno); + close(fd); + return -EINVAL; + } + close(fd); + + if (verbose) + fprintf(stdout, "Successfully loaded bpf_testmod.ko.\n"); + return 0; +} + +/* + * Trigger synchronize_rcu() in kernel. + */ +int kern_sync_rcu(void) +{ + return syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0, 0); +} |
