summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/bpf
diff options
context:
space:
mode:
authorPuranjay Mohan <puranjay@kernel.org>2026-09-22 13:00:53 -0700
committerAlexei Starovoitov <ast@kernel.org>2026-09-22 23:44:24 +0000
commitb22f65a009ad2fff81eca699fb591b89b4980a37 (patch)
tree2dc49608fc9a4559f304126557f691c9a0e9fe2b /tools/testing/selftests/bpf
parentdb1b20ed6b093d98bfc3fb7ced2dce971d4e81ce (diff)
downloadlinux-next-b22f65a009ad2fff81eca699fb591b89b4980a37.tar.gz
linux-next-b22f65a009ad2fff81eca699fb591b89b4980a37.zip
selftests/bpf: Add a test for bpf_call_rcu_tasks_trace()
Run the same functional test against the tasks trace flavour. Signed-off-by: Puranjay Mohan <puranjay@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://patch.msgid.link/20260922200208.3203834-5-puranjay@kernel.org
Diffstat (limited to 'tools/testing/selftests/bpf')
-rw-r--r--tools/testing/selftests/bpf/prog_tests/call_rcu.c12
-rw-r--r--tools/testing/selftests/bpf/progs/call_rcu.c17
2 files changed, 25 insertions, 4 deletions
diff --git a/tools/testing/selftests/bpf/prog_tests/call_rcu.c b/tools/testing/selftests/bpf/prog_tests/call_rcu.c
index bfa6512b9052..e4d271d43d87 100644
--- a/tools/testing/selftests/bpf/prog_tests/call_rcu.c
+++ b/tools/testing/selftests/bpf/prog_tests/call_rcu.c
@@ -28,9 +28,10 @@ static bool wait_for_callbacks(struct call_rcu *skel, int expected)
return ASSERT_GE(got, expected, "callbacks");
}
-static void test_call_rcu_run(void)
+static void test_call_rcu_run(bool trace)
{
LIBBPF_OPTS(bpf_test_run_opts, opts);
+ struct bpf_program *prog;
struct call_rcu *skel;
struct elem elem;
__u32 key = 1;
@@ -40,7 +41,8 @@ static void test_call_rcu_run(void)
if (!ASSERT_OK_PTR(skel, "skel_open_and_load"))
return;
- err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arm), &opts);
+ prog = trace ? skel->progs.arm_trace : skel->progs.arm;
+ err = bpf_prog_test_run_opts(bpf_program__fd(prog), &opts);
if (!ASSERT_OK(err, "test_run") || !ASSERT_EQ(opts.retval, 0, "retval"))
goto out;
@@ -59,7 +61,7 @@ static void test_call_rcu_run(void)
ASSERT_EQ(elem.val, 0, "value_cleared");
/* The head is disarmed before the callback runs, so it can be reused. */
- err = bpf_prog_test_run_opts(bpf_program__fd(skel->progs.arm), &opts);
+ err = bpf_prog_test_run_opts(bpf_program__fd(prog), &opts);
if (!ASSERT_OK(err, "test_run_again"))
goto out;
ASSERT_EQ(skel->bss->arm_err, 0, "rearm_err");
@@ -254,7 +256,9 @@ out:
void test_call_rcu(void)
{
if (test__start_subtest("run"))
- test_call_rcu_run();
+ test_call_rcu_run(false);
+ if (test__start_subtest("run_tasks_trace"))
+ test_call_rcu_run(true);
if (test__start_subtest("chain"))
test_call_rcu_chain();
if (test__start_subtest("two_heads"))
diff --git a/tools/testing/selftests/bpf/progs/call_rcu.c b/tools/testing/selftests/bpf/progs/call_rcu.c
index 94d92cee88a7..505008647fd6 100644
--- a/tools/testing/selftests/bpf/progs/call_rcu.c
+++ b/tools/testing/selftests/bpf/progs/call_rcu.c
@@ -86,6 +86,23 @@ int arm_both(void *ctx)
return 0;
}
+SEC("syscall")
+int arm_trace(void *ctx)
+{
+ __u32 key = 1;
+ struct elem *e;
+
+ e = bpf_map_lookup_elem(&arr, &key);
+ if (!e)
+ return 1;
+
+ e->val = 0xdeadbeef;
+ /* No lock needed: the enclosing rcu_read_lock_trace() already blocks the grace period. */
+ arm_err = bpf_call_rcu_tasks_trace(&e->rh, &arr, reclaim);
+ busy_err = bpf_call_rcu_tasks_trace(&e->rh, &arr, reclaim);
+ return 0;
+}
+
SEC("iter/bpf_map_elem")
int dump(struct bpf_iter__bpf_map_elem *ctx)
{