Re: [PATCH bpf-next 2/2] selftests/bpf: Add testcases for callback with tailcall
From: Pu Lehui
Date: Mon Jul 13 2026 - 22:02:11 EST
Hi Eduard,
Thanks for reviewing.
On 2026/7/14 6:12, Eduard Zingerman wrote:
On Sat, 2026-07-11 at 10:47 +0000, Pu Lehui wrote:
[...]
diff --git a/tools/testing/selftests/bpf/prog_tests/tailcalls.c b/tools/testing/selftests/bpf/prog_tests/tailcalls.c
index a5a226d0104c..c66037162da5 100644
--- a/tools/testing/selftests/bpf/prog_tests/tailcalls.c
+++ b/tools/testing/selftests/bpf/prog_tests/tailcalls.c
[...]
void test_tailcalls(void)
{
if (test__start_subtest("tailcall_1"))
@@ -1967,4 +1973,5 @@ void test_tailcalls(void)
test_tailcall_cgrp_storage_no_storage_leaf();
if (test__start_subtest("tailcall_cgrp_storage_no_storage_bridge"))
test_tailcall_cgrp_storage_no_storage_bridge();
+ test_tailcall_callback();
Please use test__start_subtest().
I use `RUN_TESTS(tailcall_callback)` above, so it will parse subtest base on `__description(desc)` or test func_proto. Also, it will make sense to test only by `test_progs -a tailcalls/tailcall_bpf2bpf_callback`
But if use `test__start_subtest`, it will show double test items:
#480/37 tailcalls/tailcall_cgrp_storage_no_storage_bridge:OK
#480/38 tailcalls/test_tailcall_bpf2bpf_callback:OK <--
#480/39 tailcalls/tailcall_bpf2bpf_callback:OK <--
#480 tailcalls:OK
Summary: 1/39 PASSED, 0 SKIPPED, 0 FAILED
}
diff --git a/tools/testing/selftests/bpf/progs/tailcall_callback.c b/tools/testing/selftests/bpf/progs/tailcall_callback.c
new file mode 100644
index 000000000000..504d8e7a6996
--- /dev/null
+++ b/tools/testing/selftests/bpf/progs/tailcall_callback.c
[...]
+/* callback involving 1 subprog with tail call is rejected */
+SEC("tc")
+__failure __msg("cannot tail call within callback")
+int tailcall_bpf2bpf_callback_1(struct __sk_buff *skb)
+{
+ clobber_regs_stack();
+
+ bpf_loop(1, callback_loop_2, &skb, 0);
+ return 0;
+}
I think having all three is a bit redundant,
let's settle on tailcall_bpf2bpf_callback_1?
make sense to me