From: Yonghong Song <yonghong.song@linux.dev>
To: Eduard Zingerman <eddyz87@gmail.com>, bpf@vger.kernel.org
Cc: Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
"Jose E . Marchesi" <jose.marchesi@oracle.com>,
kernel-team@fb.com, Martin KaFai Lau <martin.lau@kernel.org>
Subject: Re: [PATCH bpf-next 02/18] bpf: Add precision marking and backtracking for stack argument slots
Date: Tue, 28 Apr 2026 21:54:21 +0100 [thread overview]
Message-ID: <8c6455e1-94f5-42e5-8d27-66787dec878f@linux.dev> (raw)
In-Reply-To: <d85346c710e62c1ccf1babe1c5e5ebce6c757fb6.camel@gmail.com>
On 4/28/26 9:46 AM, Eduard Zingerman wrote:
> On Fri, 2026-04-24 at 10:14 -0700, Yonghong Song wrote:
>> Extend the precision marking and backtracking infrastructure to
>> support stack argument slots (r11-based accesses). Without this,
>> precision demands for scalar values passed through stack arguments
>> are silently dropped, which could allow the verifier to incorrectly
>> prune states with different constant values in stack arg slots.
>>
>> INSN_F_STACK_ARG_ACCESS is encoded as INSN_F_STACK_ACCESS |
>> INSN_F_DST_REG_STACK (BIT(9) | BIT(10)). This is safe because
>> INSN_F_STACK_ACCESS is only used for ST/STX/LDX insns while
>> INSN_F_DST_REG_STACK is only used for JMP insns — they never appear
>> on the same instruction. This keeps the total within the 12-bit
>> jmp_history flags budget.
>>
>> Three components are added:
>>
>> 1. Jump history recording for stack arg accesses:
>> - check_stack_arg_write() records INSN_F_STACK_ARG_ACCESS for
>> outgoing stores.
>> - check_stack_arg_read() records INSN_F_STACK_ARG_ACCESS for
>> incoming loads.
>>
>> 2. backtrack_insn() handling:
>> - BPF_LDX: when backtracking through an incoming stack arg load,
>> transfer precision demand from the destination register to the
>> stack arg slot mask.
>> - BPF_STX/BPF_ST: when backtracking through an outgoing stack arg
>> store, transfer precision demand from the stack arg slot to the
>> source register.
>> - Call boundary: when exiting a callee back to the caller,
>> propagate the callee's incoming stack arg precision bits to the
>> caller's outgoing stack arg slots. The slot index maps directly
>> (slot i in callee corresponds to slot i in caller) since the
>> caller's stack_arg_regs only contains outgoing slots.
>>
>> 3. bpf_mark_chain_precision() state walking:
>> - When iterating parent states, mark stack_arg_regs[spi].precise
>> for slots that have pending precision demand.
>>
>> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
>> ---
> Acked-by: Eduard Zingerman <eddyz87@gmail.com>
>
>> include/linux/bpf_verifier.h | 13 ++++++++
>> kernel/bpf/backtrack.c | 61 ++++++++++++++++++++++++++++++++++--
>> kernel/bpf/verifier.c | 30 +++++++++++++++---
>> 3 files changed, 98 insertions(+), 6 deletions(-)
>>
>> diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
>> index 2cc349d7fc17..735f33ad3db7 100644
>> --- a/include/linux/bpf_verifier.h
>> +++ b/include/linux/bpf_verifier.h
>> @@ -393,6 +393,13 @@ enum {
>> INSN_F_SPI_SHIFT = 3, /* shifted 3 bits to the left */
>>
>> INSN_F_STACK_ACCESS = BIT(9),
>> + /*
>> + * INSN_F_STACK_ARG_ACCESS uses INSN_F_STACK_ACCESS | INSN_F_DST_REG_STACK.
>> + * This is safe because INSN_F_DST_REG_STACK is only used for JMP insns
>> + * while INSN_F_STACK_ACCESS is only used for ST/STX/LDX insns — they
>> + * never appear on the same instruction.
>> + */
>> + INSN_F_STACK_ARG_ACCESS = BIT(9) | BIT(10),
> Tbh, I'd split bpf_jmp_history_entry like this:
>
> struct bpf_jmp_history_entry {
> u32 idx:20;
> u32 frame:3;
> u32 spi:6;
> /* insn idx can't be bigger than 1 million */
> u32 prev_idx : 20;
> /* special INSN_F_xxx flags */
> u32 flags : 12;
> /* additional registers that need precision tracking when this
> * jump is backtracked, vector of six 10-bit records
> */
> u64 linked_regs;
> };
Good point, let me try.
>
> [...]
>
>> @@ -453,9 +498,10 @@ static int backtrack_insn(struct bpf_verifier_env *env, int idx, int subseq_idx,
>> bt_stack_mask(bt));
>> return -EFAULT;
>> }
>> - /* clear r1-r5 in callback subprog's mask */
>> + /* clear r1-r5 and stack arg slots in callback subprog's mask */
>> for (i = BPF_REG_1; i <= BPF_REG_5; i++)
>> bt_clear_reg(bt, i);
>> + bt->stack_arg_masks[bt->frame] = 0;
> Nit: I think having these set at this point is a bug condition.
This one is a leftover from early patch and I didn't remove it. I just tested again.
this is indeed not needed. Will remove.
>
>> if (bt_subprog_exit(bt))
>> return -EFAULT;
>> return 0;
> [...]
>
>> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> [...]
>
>> static int check_outgoing_stack_args(struct bpf_verifier_env *env, struct bpf_func_state *caller,
>> @@ -7269,8 +7285,14 @@ static int check_mem_size_reg(struct bpf_verifier_env *env,
>> }
>> err = check_helper_mem_access(env, mem_reg, mem_argno, size_reg->umax_value,
>> access_type, zero_size_allowed, meta);
>> - if (!err)
>> - err = mark_chain_precision(env, reg_from_argno(size_argno));
>> + if (!err) {
>> + int regno = reg_from_argno(size_argno);
>> +
>> + if (regno >= 0)
>> + err = mark_chain_precision(env, regno);
>> + else
>> + err = mark_stack_arg_precision(env, arg_from_argno(size_argno) - 1);
>> + }
> Nit: maybe make this a utility function, e.g. mark_arg_precision(env, argno) ?
Sure, will do.
>
>> return err;
>> }
>>
next prev parent reply other threads:[~2026-04-28 20:54 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-24 17:14 [PATCH bpf-next 00/18] bpf: Support stack arguments for BPF functions and kfuncs Yonghong Song
2026-04-24 17:14 ` [PATCH bpf-next 01/18] bpf: Support stack arguments for bpf functions Yonghong Song
2026-04-24 18:13 ` bot+bpf-ci
2026-04-25 5:09 ` Yonghong Song
2026-04-27 20:40 ` Yonghong Song
2026-04-28 14:29 ` Eduard Zingerman
2026-04-28 16:47 ` Yonghong Song
2026-04-28 23:50 ` Yonghong Song
2026-04-29 0:28 ` Eduard Zingerman
2026-04-29 22:52 ` Yonghong Song
2026-04-30 1:38 ` Eduard Zingerman
2026-05-02 17:03 ` Alexei Starovoitov
2026-05-02 21:54 ` Yonghong Song
2026-05-08 17:33 ` Alexei Starovoitov
2026-04-24 17:14 ` [PATCH bpf-next 02/18] bpf: Add precision marking and backtracking for stack argument slots Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-25 5:10 ` Yonghong Song
2026-04-28 16:46 ` Eduard Zingerman
2026-04-28 20:54 ` Yonghong Song [this message]
2026-04-24 17:14 ` [PATCH bpf-next 03/18] bpf: Refactor record_call_access() to extract per-arg logic Yonghong Song
2026-04-29 0:51 ` Eduard Zingerman
2026-04-29 22:55 ` Yonghong Song
2026-04-24 17:14 ` [PATCH bpf-next 04/18] bpf: Extend liveness analysis to track stack argument slots Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-25 5:11 ` Yonghong Song
2026-04-29 12:22 ` Eduard Zingerman
2026-04-29 22:55 ` Yonghong Song
2026-04-24 17:14 ` [PATCH bpf-next 05/18] bpf: Reject stack arguments in non-JITed programs Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-29 12:27 ` Eduard Zingerman
2026-04-24 17:15 ` [PATCH bpf-next 06/18] bpf: Prepare architecture JIT support for stack arguments Yonghong Song
2026-04-24 17:48 ` bot+bpf-ci
2026-04-25 5:17 ` Yonghong Song
2026-04-29 12:37 ` Eduard Zingerman
2026-04-24 17:15 ` [PATCH bpf-next 07/18] bpf: Enable r11 based insns Yonghong Song
2026-04-29 12:48 ` Eduard Zingerman
2026-04-24 17:15 ` [PATCH bpf-next 08/18] bpf: Support stack arguments for kfunc calls Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-25 5:19 ` Yonghong Song
2026-04-24 17:15 ` [PATCH bpf-next 09/18] bpf: Reject stack arguments if tail call reachable Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-24 17:15 ` [PATCH bpf-next 10/18] bpf,x86: Implement JIT support for stack arguments Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-25 5:29 ` Yonghong Song
2026-04-24 17:16 ` [PATCH bpf-next 11/18] selftests/bpf: Add tests for BPF function " Yonghong Song
2026-04-24 17:16 ` [PATCH bpf-next 12/18] selftests/bpf: Add tests for stack argument validation Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 13/18] selftests/bpf: Add verifier " Yonghong Song
2026-04-24 17:48 ` bot+bpf-ci
2026-04-25 5:33 ` Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 14/18] selftests/bpf: Add BTF fixup for __naked subprog parameter names Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 15/18] selftests/bpf: Add precision backtracking test for stack arguments Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 16/18] bpf, arm64: Map BPF_REG_0 to x8 instead of x7 Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 17/18] bpf, arm64: Add JIT support for stack arguments Yonghong Song
2026-04-24 18:00 ` bot+bpf-ci
2026-04-27 9:06 ` Puranjay Mohan
2026-04-27 20:42 ` Yonghong Song
2026-04-24 17:17 ` [PATCH bpf-next 18/18] selftests/bpf: Enable stack argument tests for arm64 Yonghong Song
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=8c6455e1-94f5-42e5-8d27-66787dec878f@linux.dev \
--to=yonghong.song@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=jose.marchesi@oracle.com \
--cc=kernel-team@fb.com \
--cc=martin.lau@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.