]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
selftests/bpf: Test struct_ops map definition with type suffix
authorEduard Zingerman <eddyz87@gmail.com>
Wed, 6 Mar 2024 10:45:18 +0000 (12:45 +0200)
committerAndrii Nakryiko <andrii@kernel.org>
Wed, 6 Mar 2024 23:18:15 +0000 (15:18 -0800)
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@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: David Vernet <void@manifault.com>
Link: https://lore.kernel.org/bpf/20240306104529.6453-5-eddyz87@gmail.com
tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
tools/testing/selftests/bpf/prog_tests/test_struct_ops_module.c
tools/testing/selftests/bpf/progs/struct_ops_module.c

index 098ddd0672244f3373642dae611b3bcaec54dbab..b9b488d6d53af99af4688962c3c087b6071f3ded 100644 (file)
@@ -564,6 +564,8 @@ static int bpf_dummy_reg(void *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
         * initialized, so we need to check for NULL.
         */
index 7d6facf46ebb21ac01c0880063d6f3735d4fa473..ee5372c7f2c7c92b6b278a156753fcbecc5a8059 100644 (file)
@@ -30,11 +30,29 @@ cleanup:
        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)
 {
        struct struct_ops_module *skel;
        struct bpf_map_info info = {};
-       struct bpf_link *link;
        int err;
        u32 len;
 
@@ -59,20 +77,17 @@ 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");
-
+       check_map_info(&info);
        /* 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
         * .test_2.  So, the value of test_2_result should be 20 (4 + 13 +
         * 3).
         */
-       ASSERT_EQ(skel->bss->test_2_result, 20, "check_shadow_variables");
-
-       bpf_link__destroy(link);
-
-       check_map_info(&info);
+       if (!attach_ops_and_check(skel, skel->maps.testmod_1, 20))
+               goto cleanup;
+       if (!attach_ops_and_check(skel, skel->maps.testmod_2, 12))
+               goto cleanup;
 
 cleanup:
        struct_ops_module__destroy(skel);
index 25952fa093482fa2d89e36510460f5119d48f5e8..026cabfa7f1f671ce988da8332607ae25ee9db85 100644 (file)
@@ -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")
@@ -35,3 +37,20 @@ struct bpf_testmod_ops testmod_1 = {
        .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,
+};