From: Yonghong Song <yonghong.song@linux.dev>
To: bot+bpf-ci@kernel.org, bpf@vger.kernel.org
Cc: ast@kernel.org, andrii@kernel.org, daniel@iogearbox.net,
jose.marchesi@oracle.com, kernel-team@fb.com,
martin.lau@kernel.org, eddyz87@gmail.com, clm@meta.com,
ihor.solodrai@linux.dev
Subject: Re: [PATCH bpf-next v3 08/11] bpf,x86: Implement JIT support for stack arguments
Date: Tue, 7 Apr 2026 21:40:55 -0700 [thread overview]
Message-ID: <85de8d23-f919-4e68-929e-d4d571bdea4d@linux.dev> (raw)
In-Reply-To: <e093e4d67ae569dd8183db5affaa8ec67c3d20c7b9a46c0f78a223041efc0921@mail.kernel.org>
On 4/5/26 11:20 AM, bot+bpf-ci@kernel.org wrote:
>> diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
>> index 32864dbc2c4e..206f342a0ca0 100644
>> --- a/arch/x86/net/bpf_jit_comp.c
>> +++ b/arch/x86/net/bpf_jit_comp.c
> [ ... ]
>
>> @@ -2449,6 +2529,41 @@ st: if (is_imm8(insn->off))
>> }
>> if (!imm32)
>> return -EINVAL;
>> +
>> + if (src_reg == BPF_PSEUDO_CALL && outgoing_stack_arg_depth > 0) {
>> + s32 outgoing_base = -(prog_stack_depth + outgoing_stack_arg_depth);
>> + int n_args = outgoing_stack_arg_depth / 8;
>> +
>> + ip += push_stack_args(&prog, outgoing_base, n_args, 1);
>> + }
>> +
>> + if (src_reg != BPF_PSEUDO_CALL && insn->off > 0) {
>> + /* Kfunc calls: arg 6 -> R9, args 7+ -> push. */
>> + s32 outgoing_base = -(prog_stack_depth + outgoing_stack_arg_depth);
>> + int kfunc_stack_args = insn->off;
>> +
>> + stack_args = kfunc_stack_args > 1 ? kfunc_stack_args - 1 : 0;
>> +
>> + /* Push args 7+ in reverse order */
>> + if (stack_args > 0)
>> + ip += push_stack_args(&prog, outgoing_base, kfunc_stack_args, 2);
>> +
>> + /* mov r9, [rbp + outgoing_base] (arg 6) */
>> + if (is_imm8(outgoing_base)) {
>> + EMIT4(0x4C, 0x8B, 0x4D, outgoing_base);
>> + ip += 4;
>> + } else {
>> + EMIT3_off32(0x4C, 0x8B, 0x8D, outgoing_base);
>> + ip += 7;
>> + }
>> + }
>> if (priv_frame_ptr) {
>> push_r9(&prog);
>> ip += 2;
> When priv_frame_ptr is active (private stack in use), R9 holds the
> private frame pointer throughout the program. The existing push_r9 /
> pop_r9 around calls preserves R9 across the function call.
>
> With this new code, two issues arise when stack args and
> priv_frame_ptr are both active.
>
> For kfunc calls with stack args: the MOV R9, [rbp + outgoing_base]
> overwrites the priv_frame_ptr in R9 with arg6 before push_r9 saves
> it. After the call, pop_r9 restores arg6 into R9 instead of the
> priv_frame_ptr, so subsequent BPF_REG_FP accesses (which map to R9
> when priv_frame_ptr is set) would reference the wrong memory.
>
> For both kfunc and BPF-to-BPF calls: push_r9 inserts an extra 8
> bytes onto the stack between the pushed args and the CALL
> instruction. The callee then sees the wrong values for its stack
> arguments. For example, with a BPF-to-BPF call the callee's
> incoming arg formula expects [rbp + 16] to be the first stack arg,
> but instead it finds the caller's saved R9 value:
>
> push_stack_args: [RSP] = arg1, [RSP+8] = arg2
> push_r9: [RSP] = R9, [RSP+8] = arg1, [RSP+16] = arg2
> CALL: [RSP] = ret, [RSP+8] = R9 ...
> callee prologue: [rbp+16] = R9 (expected arg1)
>
> Both priv_stack_mode and stack_arg_depth are set independently per
> subprog in jit_subprogs(), so can this combination actually be
> reached?
Yes, it could. So in next revision, we will disable private stack
if outgoing stack arguments is not empty.
>
>> @@ -2458,6 +2573,14 @@ st: if (is_imm8(insn->off))
>> return -EINVAL;
>> if (priv_frame_ptr)
>> pop_r9(&prog);
>> + if (stack_args > 0) {
>> + /* add rsp, stack_args * 8 */
>> + EMIT4(0x48, 0x83, 0xC4, stack_args * 8);
>> + }
>> + if (src_reg == BPF_PSEUDO_CALL && outgoing_stack_arg_depth > 0) {
>> + /* add rsp, outgoing_stack_arg_depth */
>> + EMIT4(0x48, 0x83, 0xC4, outgoing_stack_arg_depth);
>> + }
>> break;
>> }
>
> ---
> AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
> See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
>
> CI run summary: https://github.com/kernel-patches/bpf/actions/runs/24006922024
next prev parent reply other threads:[~2026-04-08 4:41 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-05 17:25 [PATCH bpf-next v3 00/11] bpf: Support stack arguments for BPF functions and kfuncs Yonghong Song
2026-04-05 17:25 ` [PATCH bpf-next v3 01/11] bpf: Introduce bpf register BPF_REG_STACK_ARG_BASE Yonghong Song
2026-04-05 17:25 ` [PATCH bpf-next v3 02/11] bpf: Reuse MAX_BPF_FUNC_ARGS for maximum number of arguments Yonghong Song
2026-04-05 17:25 ` [PATCH bpf-next v3 03/11] bpf: Support stack arguments for bpf functions Yonghong Song
2026-04-05 18:20 ` bot+bpf-ci
2026-04-08 4:38 ` Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 04/11] bpf: Refactor process_iter_arg() to have proper argument index Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 05/11] bpf: Support stack arguments for kfunc calls Yonghong Song
2026-04-05 18:20 ` bot+bpf-ci
2026-04-08 4:53 ` Yonghong Song
2026-04-08 15:05 ` Alexei Starovoitov
2026-04-08 18:07 ` Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 06/11] bpf: Reject stack arguments in non-JITed programs Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 07/11] bpf: Enable stack argument support for x86_64 Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 08/11] bpf,x86: Implement JIT support for stack arguments Yonghong Song
2026-04-05 18:20 ` bot+bpf-ci
2026-04-08 4:40 ` Yonghong Song [this message]
2026-04-08 4:42 ` Yonghong Song
2026-04-05 20:36 ` Alexei Starovoitov
2026-04-06 4:14 ` Yonghong Song
2026-04-06 4:54 ` Alexei Starovoitov
2026-04-06 4:59 ` Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 09/11] selftests/bpf: Add tests for BPF function " Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 10/11] selftests/bpf: Add negative test for greater-than-8-byte kfunc stack argument Yonghong Song
2026-04-05 17:26 ` [PATCH bpf-next v3 11/11] selftests/bpf: Add verifier tests for stack argument validation 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=85de8d23-f919-4e68-929e-d4d571bdea4d@linux.dev \
--to=yonghong.song@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bot+bpf-ci@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=clm@meta.com \
--cc=daniel@iogearbox.net \
--cc=eddyz87@gmail.com \
--cc=ihor.solodrai@linux.dev \
--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.