diff options
| author | Puranjay Mohan <puranjay@kernel.org> | 2026-09-22 13:00:53 -0700 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2026-09-22 23:44:24 +0000 |
| commit | b22f65a009ad2fff81eca699fb591b89b4980a37 (patch) | |
| tree | 2dc49608fc9a4559f304126557f691c9a0e9fe2b /tools/testing/selftests/bpf | |
| parent | db1b20ed6b093d98bfc3fb7ced2dce971d4e81ce (diff) | |
| download | linux-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.c | 12 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/progs/call_rcu.c | 17 |
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) { |
