Verify that the cookie also works for bpf prog targets of tracing_multi
link.

Assisted-by: Codex:gpt-5.5
Signed-off-by: Leon Hwang <[email protected]>
---
 .../selftests/bpf/prog_tests/tracing_multi.c  | 25 ++++++++++++++++++-
 .../selftests/bpf/progs/tracing_multi_bpf.c   | 13 ++++++++--
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/prog_tests/tracing_multi.c 
b/tools/testing/selftests/bpf/prog_tests/tracing_multi.c
index 5cf11707eaf8..070266a864d4 100644
--- a/tools/testing/selftests/bpf/prog_tests/tracing_multi.c
+++ b/tools/testing/selftests/bpf/prog_tests/tracing_multi.c
@@ -304,9 +304,12 @@ static int run_bpf_target(struct bpf_program *prog, __u32 
retval, const char *na
        return 0;
 }
 
-static void test_link_api_bpf_prog(void)
+static void __test_link_api_bpf_prog(bool test_cookies)
 {
        const char *funcs[] = { "target_1", "target_2" };
+       __u64 fentry_cookies[] = { 0xfeed01, 0xfeed01 };
+       __u64 fexit_cookies[] = { 0xfeed02, 0xfeed02 };
+       __u64 fsession_cookies[] = { 0xfeed03, 0xfeed03 };
        LIBBPF_OPTS(bpf_tracing_multi_opts, opts);
        struct tracing_multi_bpf *skel = NULL;
        int fds[ARRAY_SIZE(funcs)];
@@ -319,20 +322,28 @@ static void test_link_api_bpf_prog(void)
        fds[0] = bpf_program__fd(skel->progs.target_1);
        fds[1] = bpf_program__fd(skel->progs.target_2);
 
+       skel->bss->test_cookies = test_cookies;
+       skel->bss->fentry_cookie = fentry_cookies[0];
+       skel->bss->fexit_cookie = fexit_cookies[0];
+       skel->bss->fsession_cookie = fsession_cookies[0];
+
        opts.fds = fds;
        opts.funcs = funcs;
        opts.cnt = ARRAY_SIZE(fds);
 
+       opts.cookies = test_cookies ? fentry_cookies : NULL;
        link = bpf_program__attach_tracing_multi(skel->progs.test_fentry, NULL, 
&opts);
        if (!ASSERT_OK_PTR(link, "attach_fentry"))
                goto cleanup;
        skel->links.test_fentry = link;
 
+       opts.cookies = test_cookies ? fexit_cookies : NULL;
        link = bpf_program__attach_tracing_multi(skel->progs.test_fexit, NULL, 
&opts);
        if (!ASSERT_OK_PTR(link, "attach_fexit"))
                goto cleanup;
        skel->links.test_fexit = link;
 
+       opts.cookies = test_cookies ? fsession_cookies : NULL;
        link = bpf_program__attach_tracing_multi(skel->progs.test_fsession, 
NULL, &opts);
        if (!ASSERT_OK_PTR(link, "attach_fsession"))
                goto cleanup;
@@ -356,6 +367,16 @@ static void test_link_api_bpf_prog(void)
        tracing_multi_bpf__destroy(skel);
 }
 
+static void test_link_api_bpf_prog(void)
+{
+       __test_link_api_bpf_prog(false);
+}
+
+static void test_cookies_bpf_prog(void)
+{
+       __test_link_api_bpf_prog(true);
+}
+
 static void test_module_skel_api(void)
 {
        struct tracing_multi_module *skel = NULL;
@@ -1196,4 +1217,6 @@ void test_tracing_multi_test(void)
                test_link_api_bpf_prog();
        if (test__start_subtest("attach_api_bpf_prog_fails"))
                test_attach_api_bpf_prog_fails();
+       if (test__start_subtest("cookies_bpf_prog"))
+               test_cookies_bpf_prog();
 }
diff --git a/tools/testing/selftests/bpf/progs/tracing_multi_bpf.c 
b/tools/testing/selftests/bpf/progs/tracing_multi_bpf.c
index 3e02602558ad..651b5d86203f 100644
--- a/tools/testing/selftests/bpf/progs/tracing_multi_bpf.c
+++ b/tools/testing/selftests/bpf/progs/tracing_multi_bpf.c
@@ -5,6 +5,10 @@
 
 char _license[] SEC("license") = "GPL";
 
+bool test_cookies;
+__u64 fentry_cookie;
+__u64 fexit_cookie;
+__u64 fsession_cookie;
 __u64 test_result_fentry;
 __u64 test_result_fexit;
 __u64 test_result_fsession_entry;
@@ -29,20 +33,25 @@ int target_2(void *ctx)
 SEC("fentry.multi")
 int BPF_PROG(test_fentry)
 {
-       test_result_fentry++;
+       if (!test_cookies || bpf_get_attach_cookie(ctx) == fentry_cookie)
+               test_result_fentry++;
        return 0;
 }
 
 SEC("fexit.multi")
 int BPF_PROG(test_fexit)
 {
-       test_result_fexit++;
+       if (!test_cookies || bpf_get_attach_cookie(ctx) == fexit_cookie)
+               test_result_fexit++;
        return 0;
 }
 
 SEC("fsession.multi")
 int BPF_PROG(test_fsession)
 {
+       if (test_cookies && bpf_get_attach_cookie(ctx) != fsession_cookie)
+               return 0;
+
        if (bpf_session_is_return(ctx))
                test_result_fsession_exit++;
        else
-- 
2.55.0


Reply via email to