On Fri, Feb 03, 2023 at 05:23:32PM +0100, Jiri Olsa wrote: > Now that we have un/load_bpf_testmod helpers in testing_helpers.h, > we can use it in other tests and save some lines. > > Acked-by: David Vernet <void@xxxxxxxxxxxxx> > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > --- > .../selftests/bpf/prog_tests/bpf_mod_race.c | 34 +++---------------- > .../selftests/bpf/prog_tests/module_attach.c | 12 +++---- > tools/testing/selftests/bpf/testing_helpers.c | 7 ++-- > tools/testing/selftests/bpf/testing_helpers.h | 2 +- > 4 files changed, 14 insertions(+), 41 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_mod_race.c b/tools/testing/selftests/bpf/prog_tests/bpf_mod_race.c > index a4d0cc9d3367..fe2c502e5089 100644 > --- a/tools/testing/selftests/bpf/prog_tests/bpf_mod_race.c > +++ b/tools/testing/selftests/bpf/prog_tests/bpf_mod_race.c > @@ -11,6 +11,7 @@ > #include "ksym_race.skel.h" > #include "bpf_mod_race.skel.h" > #include "kfunc_call_race.skel.h" > +#include "testing_helpers.h" > > /* This test crafts a race between btf_try_get_module and do_init_module, and > * checks whether btf_try_get_module handles the invocation for a well-formed > @@ -44,35 +45,10 @@ enum bpf_test_state { > > static _Atomic enum bpf_test_state state = _TS_INVALID; > > -static int sys_finit_module(int fd, const char *param_values, int flags) > -{ > - return syscall(__NR_finit_module, fd, param_values, flags); > -} > - > -static int sys_delete_module(const char *name, unsigned int flags) > -{ > - return syscall(__NR_delete_module, name, flags); > -} > - > -static int load_module(const char *mod) > -{ > - int ret, fd; > - > - fd = open("bpf_testmod.ko", O_RDONLY); > - if (fd < 0) > - return fd; > - > - ret = sys_finit_module(fd, "", 0); > - close(fd); > - if (ret < 0) > - return ret; > - return 0; > -} > - > static void *load_module_thread(void *p) > { > > - if (!ASSERT_NEQ(load_module("bpf_testmod.ko"), 0, "load_module_thread must fail")) > + if (!ASSERT_NEQ(load_bpf_testmod(false), 0, "load_module_thread must fail")) > atomic_store(&state, TS_MODULE_LOAD); > else > atomic_store(&state, TS_MODULE_LOAD_FAIL); > @@ -124,7 +100,7 @@ static void test_bpf_mod_race_config(const struct test_config *config) > if (!ASSERT_NEQ(fault_addr, MAP_FAILED, "mmap for uffd registration")) > return; > > - if (!ASSERT_OK(sys_delete_module("bpf_testmod", 0), "unload bpf_testmod")) > + if (!ASSERT_OK(unload_bpf_testmod(false), "unload bpf_testmod")) > goto end_mmap; > > skel = bpf_mod_race__open(); > @@ -202,8 +178,8 @@ static void test_bpf_mod_race_config(const struct test_config *config) > bpf_mod_race__destroy(skel); > ASSERT_OK(kern_sync_rcu(), "kern_sync_rcu"); > end_module: > - sys_delete_module("bpf_testmod", 0); > - ASSERT_OK(load_module("bpf_testmod.ko"), "restore bpf_testmod"); > + unload_bpf_testmod(false); > + ASSERT_OK(load_bpf_testmod(false), "restore bpf_testmod"); > end_mmap: > munmap(fault_addr, 4096); > atomic_store(&state, _TS_INVALID); > diff --git a/tools/testing/selftests/bpf/prog_tests/module_attach.c b/tools/testing/selftests/bpf/prog_tests/module_attach.c > index 7fc01ff490db..f53d658ed080 100644 > --- a/tools/testing/selftests/bpf/prog_tests/module_attach.c > +++ b/tools/testing/selftests/bpf/prog_tests/module_attach.c > @@ -4,6 +4,7 @@ > #include <test_progs.h> > #include <stdbool.h> > #include "test_module_attach.skel.h" > +#include "testing_helpers.h" > > static int duration; > > @@ -32,11 +33,6 @@ static int trigger_module_test_writable(int *val) > return 0; > } > > -static int delete_module(const char *name, int flags) > -{ > - return syscall(__NR_delete_module, name, flags); > -} > - > void test_module_attach(void) > { > const int READ_SZ = 456; > @@ -93,21 +89,21 @@ void test_module_attach(void) > if (!ASSERT_OK_PTR(link, "attach_fentry")) > goto cleanup; > > - ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module"); > + ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod"); > bpf_link__destroy(link); > > link = bpf_program__attach(skel->progs.handle_fexit); > if (!ASSERT_OK_PTR(link, "attach_fexit")) > goto cleanup; > > - ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module"); > + ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod"); > bpf_link__destroy(link); > > link = bpf_program__attach(skel->progs.kprobe_multi); > if (!ASSERT_OK_PTR(link, "attach_kprobe_multi")) > goto cleanup; > > - ASSERT_ERR(delete_module("bpf_testmod", 0), "delete_module"); > + ASSERT_ERR(unload_bpf_testmod(false), "unload_bpf_testmod"); > bpf_link__destroy(link); > > cleanup: > diff --git a/tools/testing/selftests/bpf/testing_helpers.c b/tools/testing/selftests/bpf/testing_helpers.c > index 3872c36c17d4..030ed157954e 100644 > --- a/tools/testing/selftests/bpf/testing_helpers.c > +++ b/tools/testing/selftests/bpf/testing_helpers.c > @@ -241,7 +241,7 @@ static int delete_module(const char *name, int flags) > return syscall(__NR_delete_module, name, flags); > } > > -void unload_bpf_testmod(bool verbose) > +int unload_bpf_testmod(bool verbose) > { > if (kern_sync_rcu()) > fprintf(stdout, "Failed to trigger kernel-side RCU sync!\n"); Per my question in [0], I'd be curious to know what the deal is with this synchronize_rcu(). If it's actually important, it seems like we should also return an error here if it fails. Otherwise, it should probably just live in bpf_testmod_exit(). A comment explaining why it's necessary seems useful regardless of where it is as well. [0]: https://lore.kernel.org/bpf/Y+JiUQFyalc0aV6M@xxxxxxxxxxxxx/ > @@ -249,13 +249,14 @@ void unload_bpf_testmod(bool verbose) > if (errno == ENOENT) { > if (verbose) > fprintf(stdout, "bpf_testmod.ko is already unloaded.\n"); > - return; > + return -1; > } > fprintf(stdout, "Failed to unload bpf_testmod.ko from kernel: %d\n", -errno); > - return; > + return -1; > } > if (verbose) > fprintf(stdout, "Successfully unloaded bpf_testmod.ko.\n"); > + return 0; > } > > int load_bpf_testmod(bool verbose) > diff --git a/tools/testing/selftests/bpf/testing_helpers.h b/tools/testing/selftests/bpf/testing_helpers.h > index 7356474def27..713f8e37163d 100644 > --- a/tools/testing/selftests/bpf/testing_helpers.h > +++ b/tools/testing/selftests/bpf/testing_helpers.h > @@ -26,7 +26,7 @@ int parse_test_list(const char *s, > bool is_glob_pattern); > > int load_bpf_testmod(bool verbose); > -void unload_bpf_testmod(bool verbose); > +int unload_bpf_testmod(bool verbose); > int kern_sync_rcu(void); > > #endif /* __TESTING_HELPERS_H */ > -- > 2.39.1 >