diff options
author | Jiri Olsa <jolsa@kernel.org> | 2024-03-08 12:43:49 +0100 |
---|---|---|
committer | Jiri Olsa <jolsa@kernel.org> | 2024-04-03 15:15:44 +0200 |
commit | 60235d4f87d60a875bffe7d635f0dc3aceb57735 (patch) | |
tree | 5dd476513f1dad8d660a960f8b0630d80aa0d74b | |
parent | fb08b3fb8198fc43e535d77c458e00ddd55a2c20 (diff) | |
download | perf-bpf/session_data_3.tar.gz |
selftests/bpf: Add uprobe multi session cookie testbpf/session_data_3
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
-rw-r--r-- | tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c | 32 | ||||
-rw-r--r-- | tools/testing/selftests/bpf/progs/uprobe_multi_session_cookie.c | 48 |
2 files changed, 80 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c index 63868053c15ee9..88a815776a5a9b 100644 --- a/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c +++ b/tools/testing/selftests/bpf/prog_tests/uprobe_multi_test.c @@ -6,6 +6,7 @@ #include "uprobe_multi_bench.skel.h" #include "uprobe_multi_usdt.skel.h" #include "uprobe_multi_session.skel.h" +#include "uprobe_multi_session_data.skel.h" #include "bpf/libbpf_internal.h" #include "testing_helpers.h" @@ -538,6 +539,35 @@ cleanup: uprobe_multi_session__destroy(skel); } +static void test_session_data_skel_api(void) +{ + struct uprobe_multi_session_data *skel = NULL; + LIBBPF_OPTS(bpf_test_run_opts, topts); + int err; + + skel = uprobe_multi_session_data__open_and_load(); + if (!ASSERT_OK_PTR(skel, "fentry_raw_skel_load")) + goto cleanup; + + skel->bss->pid = getpid(); + + err = uprobe_multi_session_data__attach(skel); + if (!ASSERT_OK(err, " kprobe_multi_session__attach")) + goto cleanup; + + /* trigger all probes */ + uprobe_multi_func_1(); + uprobe_multi_func_2(); + uprobe_multi_func_3(); + + ASSERT_EQ(skel->bss->test_uprobe_1_result, 1, "test_uprobe_1_result"); + ASSERT_EQ(skel->bss->test_uprobe_2_result, 2, "test_uprobe_2_result"); + ASSERT_EQ(skel->bss->test_uprobe_3_result, 3, "test_uprobe_3_result"); + +cleanup: + uprobe_multi_session_data__destroy(skel); +} + static void test_bench_attach_uprobe(void) { long attach_start_ns = 0, attach_end_ns = 0; @@ -628,4 +658,6 @@ void test_uprobe_multi_test(void) test_attach_api_fails(); if (test__start_subtest("session")) test_session_skel_api(); + if (test__start_subtest("session_data")) + test_session_data_skel_api(); } diff --git a/tools/testing/selftests/bpf/progs/uprobe_multi_session_cookie.c b/tools/testing/selftests/bpf/progs/uprobe_multi_session_cookie.c new file mode 100644 index 00000000000000..420ffe643b13e3 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/uprobe_multi_session_cookie.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> +#include <bpf/bpf_tracing.h> +#include <stdbool.h> +#include "bpf_kfuncs.h" + +char _license[] SEC("license") = "GPL"; + +int pid = 0; + +__u64 test_uprobe_1_result = 0; +__u64 test_uprobe_2_result = 0; +__u64 test_uprobe_3_result = 0; + +static int check_cookie(__u64 val, __u64 *result) +{ + if (bpf_get_current_pid_tgid() >> 32 != pid) + return 1; + + __u64 *cookie = bpf_session_cookie(); + + if (bpf_session_is_return()) { + *result = *cookie == val ? val : 0; + } else { + *cookie = val; + } + + return 0; +} + +SEC("uprobe.session//proc/self/exe:uprobe_multi_func_1") +int uprobe_1(struct pt_regs *ctx) +{ + return check_cookie(1, &test_uprobe_1_result); +} + +SEC("uprobe.session//proc/self/exe:uprobe_multi_func_2") +int uprobe_2(struct pt_regs *ctx) +{ + return check_cookie(2, &test_uprobe_2_result); +} + +SEC("uprobe.session//proc/self/exe:uprobe_multi_func_3") +int uprobe_3(struct pt_regs *ctx) +{ + return check_cookie(3, &test_uprobe_3_result); +} |