From: Zhenzhong Wu <jt26wzz@gmail.com>
To: bpf@vger.kernel.org
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
ast@kernel.org, daniel@iogearbox.net, john.fastabend@gmail.com,
andrii@kernel.org, martin.lau@linux.dev, song@kernel.org,
yonghong.song@linux.dev, kpsingh@kernel.org, haoluo@google.com,
jolsa@kernel.org, menglong8.dong@gmail.com, eddyz87@gmail.com,
shung-hsi.yu@suse.com, stable@vger.kernel.org, mykolal@fb.com,
tamird@kernel.org
Subject: [PATCH bpf-next] selftests/bpf: add helper retval linked scalar pruning selftest
Date: Fri, 12 Jun 2026 00:07:49 +0800 [thread overview]
Message-ID: <20260611160749.391279-1-jt26wzz@gmail.com> (raw)
Add a verifier runtime test for a branch pattern where a helper return
value and a related scalar stay live across the same control-flow
sequence. Rust/Aya-generated eBPF can naturally produce this shape when
a match on a helper status keeps data derived before the helper call
live across the same branches. Such code commonly uses the helper return
value in r0, where 0 means success, producing an r0 == 0 / r0 != 0
branch shape.
The test preserves that branch shape but shifts the success value to 1
before branching. Using r0 == 1 / r0 != 1 avoids depending on the
verifier's not-equal-zero refinement, so the test exercises linked
scalar precision and pruning behavior directly instead of being masked
by zero-specific range refinement.
On affected kernels the verifier can explore an impossible path where
r0 and r7 are linked by scalar ID, keep the wrong branch, and make the
test return 1. With linked scalar precision tracked per instruction,
state pruning keeps the real success path, and the test returns 0.
Suggested-by: Shung-Hsi Yu <shung-hsi.yu@suse.com>
Signed-off-by: Zhenzhong Wu <jt26wzz@gmail.com>
---
.../selftests/bpf/progs/verifier_scalar_ids.c | 35 +++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/tools/testing/selftests/bpf/progs/verifier_scalar_ids.c b/tools/testing/selftests/bpf/progs/verifier_scalar_ids.c
index 70ae14d60..de71d547f 100644
--- a/tools/testing/selftests/bpf/progs/verifier_scalar_ids.c
+++ b/tools/testing/selftests/bpf/progs/verifier_scalar_ids.c
@@ -448,6 +448,41 @@ __naked void linked_regs_broken_link_2(void)
: __clobber_all);
}
+SEC("tc")
+__description("helper retval linked scalar pruning")
+__success __retval(0)
+__naked void helper_retval_linked_scalar_pruning(void)
+{
+ asm volatile (
+ "r7 = *(u32 *)(r1 + %[__sk_buff_data_end]);"
+ "r5 = *(u32 *)(r1 + %[__sk_buff_data]);"
+ "r7 -= r5;"
+ "r2 = 0;"
+ "r3 = r10;"
+ "r3 += -8;"
+ "r4 = 1;"
+ "call %[bpf_skb_load_bytes];"
+ "r0 += 1;"
+ "r6 = 1;"
+ /* success path keeps r7 independent; failure path links r7 to r0. */
+ "if r0 == 1 goto l0_%=;"
+ "r7 = r0;"
+"l0_%=: if r0 != 1 goto l1_%=;"
+ "r7 <<= 32;"
+ "r7 >>= 32;"
+ "if r7 != %[test_data_len] goto l1_%=;"
+ "r0 = 0;"
+ "exit;"
+"l1_%=: r0 = r6;"
+ "exit;"
+ :
+ : __imm(bpf_skb_load_bytes),
+ __imm_const(__sk_buff_data, offsetof(struct __sk_buff, data)),
+ __imm_const(__sk_buff_data_end, offsetof(struct __sk_buff, data_end)),
+ __imm_const(test_data_len, TEST_DATA_LEN)
+ : __clobber_all);
+}
+
/* Check that mark_chain_precision() for one of the conditional jump
* operands does not trigger equal scalars precision propagation.
*/
base-commit: 30dee2c176e7954f63d1fa3e52d172f30beb9bfb
--
2.43.0
next reply other threads:[~2026-06-11 16:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-11 16:07 Zhenzhong Wu [this message]
2026-06-11 16:55 ` [PATCH bpf-next] selftests/bpf: add helper retval linked scalar pruning selftest Alexei Starovoitov
2026-06-11 16:58 ` bot+bpf-ci
2026-06-12 6:32 ` Zhenzhong Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260611160749.391279-1-jt26wzz@gmail.com \
--to=jt26wzz@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=menglong8.dong@gmail.com \
--cc=mykolal@fb.com \
--cc=netdev@vger.kernel.org \
--cc=shung-hsi.yu@suse.com \
--cc=song@kernel.org \
--cc=stable@vger.kernel.org \
--cc=tamird@kernel.org \
--cc=yonghong.song@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox