From: Vineet Gupta <vineet.gupta@linux.dev>
To: Eduard Zingerman <eddyz87@gmail.com>,
ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
memxor@gmail.com
Cc: martin.lau@linux.dev, song@kernel.org, yonghong.song@linux.dev,
jolsa@kernel.org, emil@etsalapatis.com, ihor.solodrai@linux.dev,
john.fastabend@gmail.com, shuah@kernel.org, bpf@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: Re: [RFC bpf-next 4/6] selftests/bpf: cover low-32 subreg-equal link for zero-extending movs
Date: Thu, 3 Sep 2026 11:19:57 +0530 [thread overview]
Message-ID: <df3644d0-8915-4a04-94d9-cd7fbe5cb1cc@linux.dev> (raw)
In-Reply-To: <54bed44859f9de519c56ed0fb9366160f625fce7.camel@gmail.com>
On 8/19/26 10:35 AM, Eduard Zingerman wrote:
> On Fri, 2026-08-14 at 16:19 -0700, Vineet Gupta wrote:
>
> Nit: let's keep all tests for this feature under verifier_linked_scalars.c.
yes that was a spurious __msg fix, dropped now.
>> +/*
>> + * w3 = w0 forms a low-32 BPF_FLAG_SUBREG_ZEXT link, so R3 carries an id here
>> + * where it did not before; the bounds are unchanged. The id is deterministic
>> + * (raw asm, same bytecode in every flavour) so require it rather than making
>> + * it optional -- otherwise the assertion would still pass if the link were
>> + * dropped again. The delta suffix is left general: log.c prints ->delta
>> + * directly after the id with no separator when BPF_FLAG_ADD_CONST is set.
>> + */
> Please cleanup LLM generated comments. All that changed here is 'id' for R3.
> Is it important for this specific test to match the exact regex?
Not really.
> Given the intended purpose of the test I think that the above comment is not warranted.
Yes, now removed
>> +__success
>> +__naked void subreg_eq_zext_mov_narrow(void)
>> +{
>> + asm volatile (" \
>> + call %[bpf_get_prandom_u32]; \
>> + r6 = r0; /* r6 = 64-bit unknown (helper ret is unbounded) */ \
>> + call %[bpf_get_prandom_u32]; \
>> + r0 <<= 32; /* r0 = unknown high bits */ \
>> + r6 |= r0; /* still 64-bit unknown; makes it explicit */ \
> Why the second bpf_get_prandom_u32() call is necessary?
> LLM got confused by the _u32() in the function name?
Probably ! Now removed.
>> + w7 = w6; /* 32-bit zero-extend mov, wide src */ \
>> + if w6 != 0 goto l_out_%=; /* w6 low == 0 on fall-through */ \
>> + /* w7 = zext32(w6 low) must be 0 here */ \
> All three comments above can be dropped. What should be commented on
> is that `w7 = w6' forms a link and `w6 != 0` propagates ranges through
> this link.
OK.
>> + if w7 == 0 goto l_out_%=; /* provably 0 iff linked */ \
>> + r0 /= 0; /* reached only if w7 not deduced 0 */ \
>> +l_out_%=: \
> Nit: please prefer `2: goto 1f; 1: goto 2b;' style labels.
Will do; there's a mix up of the two styles in the file.
>> +/*
>> + * A 32-bit zero-extending mov (w7 = w5) whose SOURCE is a wide ADD_CONST-linked
>> + * register (r5 = base + K) must NOT disturb that source. Forming the low-32
>> + * BPF_FLAG_SUBREG_ZEXT link on the destination would need assign_scalar_id_before_mov()
>> + * on the source, which clears its base+delta link -- and a combined
>> + * subreg+delta link isn't modeled anyway (sync_linked_regs() skips it). So for a
>> + * wide ADD_CONST src the mov leaves the source's link intact and just clears the
>> + * destination.
>> + *
>> + * Here r5 = r6 + 3 (ADD_CONST, wide). After the mov, narrowing the base r6 must
>> + * still reach r5 through the preserved link: r6 in [0, 10] => r5 in [3, 13], so
>> + * the guarded div-by-zero is unreachable. Had the mov cleared r5's link (calling
>> + * assign_scalar_id_before_mov() unconditionally), r5 would stay unbounded and the
>> + * div would be reachable (rejected).
>> + *
>> + * Note this is a no-regression guard rather than coverage of the new link:
>> + * before this feature the wide-source path also left the source untouched, so
>> + * the test passes either way. What it pins is the choice not to call
>> + * assign_scalar_id_before_mov() unconditionally.
>> + *
>> + * Written in asm so the bytecode is identical regardless of the host BPF compiler.
> Please try to make the comments less verbose.
Sorry - it is indeed exhausting.
>> + */
>> +SEC("socket")
>> +__success
>> +__naked void zext_mov_keeps_add_const_src(void)
>> +{
>> + asm volatile (" \
>> + call %[bpf_get_prandom_u32]; \
>> + r6 = r0; /* r6 low = unknown u32 */ \
>> + call %[bpf_get_prandom_u32]; \
>> + r0 <<= 32; \
>> + r6 |= r0; /* r6 = full 64-bit unknown (base) */ \
>> + r5 = r6; /* r5, r6 linked (shared id) */ \
>> + r5 += 3; /* r5 = base + 3: ADD_CONST, still wide */ \
>> + w7 = w5; /* 32-bit zext mov, wide ADD_CONST src */ \
>> + if r6 > 10 goto l_out_%=;/* r6 in [0, 10] */ \
>> + /* r5 = r6 + 3 must be in [3, 13] here (needs the kept link) */ \
>> + if r5 > 13 goto l_err_%=;/* taken only if r5 not narrowed */ \
>> + goto l_out_%=; \
>> +l_err_%=: \
>> + r0 /= 0; /* reachable iff r5's link was cleared */ \
>> +l_out_%=: \
>> + r0 = 0; \
>> + exit; \
>> +" :
>> + : __imm(bpf_get_prandom_u32)
>> + : __clobber_all);
>> +}
> ...
>
> Given the changes in regsafe/check_alu_op/sync_linked_regs,
> I think the following cases are not covered:
Added now.
> - regsafe: a state whose register carries BPF_FLAG_SUBREG_ZEXT must
> not be deemed safe against one without it.
zext_link_mismatch_blocks_pruning
> - check_alu_op: a provably-u32 source takes the full-equality path and
> must not be flagged ZEXT.
zext_u32_src_is_full_link
> - check_alu_op: a self-mov w6 = w6 must not generate a self-link and
> should clear dst's id.
zext_self_mov_no_link
> - check_alu_op: a ZEXT-linked source must survive
> assign_scalar_id_before_mov(), so a chain of 32-bit assignments
> should preserve the id and the flag.
zext_chain_keeps_link
> - sync_linked_regs: no propagation when reg has ZEXT and known_reg has ADD_CONST.
zext_no_sync_when_base_has_delta
> - sync_linked_regs: no propagation when known_reg has ZEXT and reg has ADD_CONST.
zext_no_sync_from_subreg_base
> - sync_linked_regs: low-32 reconstruction must still propagate when
> both reg and known_reg have ZEXT.
zext_sync_between_two_subregs
Thx,
-Vineet
next prev parent reply other threads:[~2026-09-03 5:50 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 23:19 [RFC bpf-next 0/6] bpf: track scalar equality across the low 32 bits Vineet Gupta
2026-08-14 23:19 ` [RFC bpf-next 1/6] bpf: turn bpf_reg_state->precise into a flags field [NFC] Vineet Gupta
2026-08-18 21:38 ` Eduard Zingerman
2026-08-14 23:19 ` [RFC bpf-next 2/6] bpf: move the linked-scalar flags into bpf_reg_state->flags [NFC] Vineet Gupta
2026-08-18 22:51 ` Eduard Zingerman
2026-08-14 23:19 ` [RFC bpf-next 3/6] bpf: support low-32 subreg scalar linking for zero-extending movs Vineet Gupta
2026-08-19 3:39 ` Eduard Zingerman
2026-08-19 4:07 ` Eduard Zingerman
2026-08-14 23:19 ` [RFC bpf-next 4/6] selftests/bpf: cover low-32 subreg-equal link " Vineet Gupta
2026-08-19 5:05 ` Eduard Zingerman
2026-09-03 5:49 ` Vineet Gupta [this message]
2026-08-14 23:19 ` [RFC bpf-next 5/6] bpf: support low-32 subreg scalar linking for sign-extending movs Vineet Gupta
2026-08-19 6:18 ` Eduard Zingerman
2026-08-14 23:19 ` [RFC bpf-next 6/6] selftests/bpf: cover 32-bit sign-extension low-32 links Vineet Gupta
2026-08-19 4:35 ` [RFC bpf-next 0/6] bpf: track scalar equality across the low 32 bits Eduard Zingerman
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=df3644d0-8915-4a04-94d9-cd7fbe5cb1cc@linux.dev \
--to=vineet.gupta@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=emil@etsalapatis.com \
--cc=ihor.solodrai@linux.dev \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=shuah@kernel.org \
--cc=song@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