On Tue, Feb 27, 2024 at 10:45:52PM +0200, Eduard Zingerman wrote: > Extend struct_ops_module test case to check if it is possible to use > '___' suffixes for struct_ops type specification. > > Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> Acked-by: David Vernet <void@xxxxxxxxxxxxx> > --- > .../selftests/bpf/bpf_testmod/bpf_testmod.c | 1 + > .../bpf/prog_tests/test_struct_ops_module.c | 32 +++++++++++++------ > .../selftests/bpf/progs/struct_ops_module.c | 21 +++++++++++- > 3 files changed, 44 insertions(+), 10 deletions(-) > > diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > index 66787e99ba1b..0d8437e05f64 100644 > --- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > +++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c > @@ -555,6 +555,7 @@ static int bpf_dummy_reg(void *kdata) > { > struct bpf_testmod_ops *ops = kdata; > > + ops->test_1(); > /* Some test cases (ex. struct_ops_maybe_null) may not have test_2 > * initialized, so we need to check for NULL. > */ > diff --git a/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c > index 8d833f0c7580..7bc80d2755f1 100644 > --- a/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c > +++ b/tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c > @@ -30,12 +30,30 @@ static void check_map_info(struct bpf_map_info *info) > close(fd); > } > > +static int attach_ops_and_check(struct struct_ops_module *skel, > + struct bpf_map *map, > + int expected_test_2_result) > +{ > + struct bpf_link *link; > + > + link = bpf_map__attach_struct_ops(map); > + ASSERT_OK_PTR(link, "attach_test_mod_1"); > + if (!link) > + return -1; > + > + /* test_{1,2}() would be called from bpf_dummy_reg() in bpf_testmod.c */ > + ASSERT_EQ(skel->bss->test_1_result, 0xdeadbeef, "test_1_result"); > + ASSERT_EQ(skel->bss->test_2_result, expected_test_2_result, "test_2_result"); > + > + bpf_link__destroy(link); > + return 0; > +} > + > static void test_struct_ops_load(void) > { > DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); > struct struct_ops_module *skel; > struct bpf_map_info info = {}; > - struct bpf_link *link; > int err; > u32 len; > > @@ -53,15 +71,11 @@ static void test_struct_ops_load(void) > if (!ASSERT_OK(err, "bpf_map_get_info_by_fd")) > goto cleanup; > > - link = bpf_map__attach_struct_ops(skel->maps.testmod_1); > - ASSERT_OK_PTR(link, "attach_test_mod_1"); > - > - /* test_2() will be called from bpf_dummy_reg() in bpf_testmod.c */ > - ASSERT_EQ(skel->bss->test_2_result, 7, "test_2_result"); > - > - bpf_link__destroy(link); > - > check_map_info(&info); > + if (!attach_ops_and_check(skel, skel->maps.testmod_1, 7)) > + goto cleanup; > + if (!attach_ops_and_check(skel, skel->maps.testmod_2, 12)) > + goto cleanup; > > cleanup: > struct_ops_module__destroy(skel); > diff --git a/tools/testing/selftests/bpf/progs/struct_ops_module.c b/tools/testing/selftests/bpf/progs/struct_ops_module.c > index b78746b3cef3..e91426dc51af 100644 > --- a/tools/testing/selftests/bpf/progs/struct_ops_module.c > +++ b/tools/testing/selftests/bpf/progs/struct_ops_module.c > @@ -7,12 +7,14 @@ > > char _license[] SEC("license") = "GPL"; > > +int test_1_result = 0; > int test_2_result = 0; > > SEC("struct_ops/test_1") > int BPF_PROG(test_1) > { > - return 0xdeadbeef; > + test_1_result = 0xdeadbeef; > + return 0; > } > > SEC("struct_ops/test_2") > @@ -27,3 +29,20 @@ struct bpf_testmod_ops testmod_1 = { > .test_2 = (void *)test_2, > }; > > +SEC("struct_ops/test_2") > +void BPF_PROG(test_2_v2, int a, int b) > +{ > + test_2_result = a * b; > +} > + > +struct bpf_testmod_ops___v2 { > + int (*test_1)(void); > + void (*test_2)(int a, int b); > + int (*test_maybe_null)(int dummy, struct task_struct *task); > +}; > + > +SEC(".struct_ops.link") > +struct bpf_testmod_ops___v2 testmod_2 = { > + .test_1 = (void *)test_1, > + .test_2 = (void *)test_2_v2, > +}; > -- > 2.43.0 >
Attachment:
signature.asc
Description: PGP signature