Commit 5bab7a27 authored by Eduard Zingerman's avatar Eduard Zingerman Committed by Andrii Nakryiko

selftests/bpf: Test struct_ops map definition with type suffix

Extend struct_ops_module test case to check if it is possible to use
'___' suffixes for struct_ops type specification.
Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarDavid Vernet <void@manifault.com>
Link: https://lore.kernel.org/bpf/20240306104529.6453-5-eddyz87@gmail.com
parent 8db05261
...@@ -564,6 +564,8 @@ static int bpf_dummy_reg(void *kdata) ...@@ -564,6 +564,8 @@ static int bpf_dummy_reg(void *kdata)
{ {
struct bpf_testmod_ops *ops = kdata; struct bpf_testmod_ops *ops = kdata;
if (ops->test_1)
ops->test_1();
/* Some test cases (ex. struct_ops_maybe_null) may not have test_2 /* Some test cases (ex. struct_ops_maybe_null) may not have test_2
* initialized, so we need to check for NULL. * initialized, so we need to check for NULL.
*/ */
......
...@@ -30,11 +30,29 @@ static void check_map_info(struct bpf_map_info *info) ...@@ -30,11 +30,29 @@ static void check_map_info(struct bpf_map_info *info)
close(fd); 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) static void test_struct_ops_load(void)
{ {
struct struct_ops_module *skel; struct struct_ops_module *skel;
struct bpf_map_info info = {}; struct bpf_map_info info = {};
struct bpf_link *link;
int err; int err;
u32 len; u32 len;
...@@ -59,20 +77,17 @@ static void test_struct_ops_load(void) ...@@ -59,20 +77,17 @@ static void test_struct_ops_load(void)
if (!ASSERT_OK(err, "bpf_map_get_info_by_fd")) if (!ASSERT_OK(err, "bpf_map_get_info_by_fd"))
goto cleanup; goto cleanup;
link = bpf_map__attach_struct_ops(skel->maps.testmod_1); check_map_info(&info);
ASSERT_OK_PTR(link, "attach_test_mod_1");
/* test_3() will be called from bpf_dummy_reg() in bpf_testmod.c /* test_3() will be called from bpf_dummy_reg() in bpf_testmod.c
* *
* In bpf_testmod.c it will pass 4 and 13 (the value of data) to * In bpf_testmod.c it will pass 4 and 13 (the value of data) to
* .test_2. So, the value of test_2_result should be 20 (4 + 13 + * .test_2. So, the value of test_2_result should be 20 (4 + 13 +
* 3). * 3).
*/ */
ASSERT_EQ(skel->bss->test_2_result, 20, "check_shadow_variables"); if (!attach_ops_and_check(skel, skel->maps.testmod_1, 20))
goto cleanup;
bpf_link__destroy(link); if (!attach_ops_and_check(skel, skel->maps.testmod_2, 12))
goto cleanup;
check_map_info(&info);
cleanup: cleanup:
struct_ops_module__destroy(skel); struct_ops_module__destroy(skel);
......
...@@ -7,12 +7,14 @@ ...@@ -7,12 +7,14 @@
char _license[] SEC("license") = "GPL"; char _license[] SEC("license") = "GPL";
int test_1_result = 0;
int test_2_result = 0; int test_2_result = 0;
SEC("struct_ops/test_1") SEC("struct_ops/test_1")
int BPF_PROG(test_1) int BPF_PROG(test_1)
{ {
return 0xdeadbeef; test_1_result = 0xdeadbeef;
return 0;
} }
SEC("struct_ops/test_2") SEC("struct_ops/test_2")
...@@ -35,3 +37,20 @@ struct bpf_testmod_ops testmod_1 = { ...@@ -35,3 +37,20 @@ struct bpf_testmod_ops testmod_1 = {
.data = 0x1, .data = 0x1,
}; };
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,
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment