public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
From: Yonghong Song <yonghong.song@linux.dev>
To: 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 v2 00/11] bpf: Support stack arguments for BPF functions and kfuncs
Date: Sun, 5 Apr 2026 10:08:57 -0700	[thread overview]
Message-ID: <2251a12b-2c2c-4222-935f-0629f44ecc8a@linux.dev> (raw)
In-Reply-To: <20260405165300.826241-1-yonghong.song@linux.dev>



On 4/5/26 9:53 AM, Yonghong Song wrote:
> Currently, bpf function calls and kfunc's are limited by 5 reg-level
> parameters. For function calls with more than 5 parameters,
> developers can use always inlining or pass a struct pointer
> after packing more parameters in that struct. But there is
> no workaround for kfunc if more than 5 parameters is needed.
>
> This patch set lifts the 5-argument limit by introducing stack-based
> argument passing for BPF functions and kfunc's, coordinated with
> compiler support in LLVM [1]. The compiler emits loads/stores through
> a new bpf register r12 (BPF_REG_STACK_ARG_BASE) to pass arguments beyond
> the 5th, keeping the stack arg area separate from the r10-based program
> stack. The maximum number of arguments is capped at MAX_BPF_FUNC_ARGS
> (12), which is sufficient for the vast majority of use cases.
>
> The x86_64 JIT translates r12-relative accesses to RBP-relative
> native instructions. Each function's stack allocation is extended
> by 'max_outgoing' bytes to hold the outgoing arg area below the
> program stack. This makes implementation easier as the r10 can be
> reused for stack argument access. At BPF-to-BPF call sites, outgoing
> args are pushed onto the native stack before CALL. The incoming
> parameters can directly get the value from pushed native stack from
> caller. For kfunc calls, args are marshaled per the x86_64 C calling
> convention (arg 6 in R9, args 7+ on the native stack).
>
> Global subprogs with >5 args are not yet supported. Only x86_64
> is supported for now.
>
> For the rest of patches, patches 1-6 added verifier support of
> stack arguments for bpf-to-bpf functions and kfunc's. Patch 7
> enables x86_64 for stack arguments. Patch 8 implemented JIT for
> x86_64. Patches 9-11 are some selftests.
>
>    [1] https://github.com/llvm/llvm-project/pull/189060
>
> Changelogs:
>    v1 -> v2:
>      - v1: https://lore.kernel.org/bpf/20260402012727.3916819-1-yonghong.song@linux.dev/
>      - Add stack_arg_safe() to do pruning for stack arguments.
>      - Fix an issue with KF_ARG_PTR_TO_MEM_SIZE. Since a faked register is
>        used, added verification log to indicate the start and end of such
>        faked register usage.
>      - For x86_64 JIT, copying incoming parameter values directly from caller's stack.
>      - Add test cases with stack arguments e.g. mem, mem+size, dynptr, iter, etc.
>
> Yonghong Song (11):
>    bpf: Introduce bpf register BPF_REG_STACK_ARG_BASE
>    bpf: Reuse MAX_BPF_FUNC_ARGS for maximum number of arguments
>    bpf: Support stack arguments for bpf functions
>    bpf: Refactor process_iter_arg() to have proper argument index
>    bpf: Support stack arguments for kfunc calls
>    bpf: Reject stack arguments in non-JITed programs
>    bpf: Enable stack argument support for x86_64
>    bpf,x86: Implement JIT support for stack arguments
>    selftests/bpf: Add tests for BPF function stack arguments
>    selftests/bpf: Add negative test for greater-than-8-byte kfunc stack
>      argument
>    selftests/bpf: Add verifier tests for stack argument validation
>
>   arch/x86/net/bpf_jit_comp.c                   | 140 +++++-
>   include/linux/bpf.h                           |   6 +
>   include/linux/bpf_verifier.h                  |  31 +-
>   include/linux/filter.h                        |   4 +-
>   kernel/bpf/btf.c                              |  21 +-
>   kernel/bpf/core.c                             |  12 +-
>   kernel/bpf/verifier.c                         | 474 ++++++++++++++++--
>   .../selftests/bpf/prog_tests/stack_arg.c      | 132 +++++
>   .../selftests/bpf/prog_tests/stack_arg_fail.c |  24 +
>   .../selftests/bpf/prog_tests/verifier.c       |   2 +
>   tools/testing/selftests/bpf/progs/stack_arg.c | 212 ++++++++
>   .../selftests/bpf/progs/stack_arg_fail.c      |  32 ++
>   .../selftests/bpf/progs/stack_arg_kfunc.c     | 164 ++++++
>   .../selftests/bpf/progs/verifier_stack_arg.c  | 302 +++++++++++
>   .../selftests/bpf/test_kmods/bpf_testmod.c    |  72 +++
>   .../bpf/test_kmods/bpf_testmod_kfunc.h        |  26 +
>   16 files changed, 1594 insertions(+), 60 deletions(-)
>   create mode 100644 tools/testing/selftests/bpf/prog_tests/stack_arg.c
>   create mode 100644 tools/testing/selftests/bpf/prog_tests/stack_arg_fail.c
>   create mode 100644 tools/testing/selftests/bpf/progs/stack_arg.c
>   create mode 100644 tools/testing/selftests/bpf/progs/stack_arg_fail.c
>   create mode 100644 tools/testing/selftests/bpf/progs/stack_arg_kfunc.c
>   create mode 100644 tools/testing/selftests/bpf/progs/verifier_stack_arg.c
>
Please ignore this patch set. Just discovered that there is a selftest failure
and a couple of 'UTF-8' issues. I will fix these issues and send the next revision
shortly.


      parent reply	other threads:[~2026-04-05 17:09 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-05 16:53 [PATCH bpf-next v2 00/11] bpf: Support stack arguments for BPF functions and kfuncs Yonghong Song
2026-04-05 16:53 ` [PATCH bpf-next v2 01/11] bpf: Introduce bpf register BPF_REG_STACK_ARG_BASE Yonghong Song
2026-04-05 16:53 ` [PATCH bpf-next v2 02/11] bpf: Reuse MAX_BPF_FUNC_ARGS for maximum number of arguments Yonghong Song
2026-04-05 16:53 ` [PATCH bpf-next v2 03/11] bpf: Support stack arguments for bpf functions Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 04/11] bpf: Refactor process_iter_arg() to have proper argument index Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 05/11] bpf: Support stack arguments for kfunc calls Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 06/11] bpf: Reject stack arguments in non-JITed programs Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 07/11] bpf: Enable stack argument support for x86_64 Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 08/11] bpf,x86: Implement JIT support for stack arguments Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 09/11] selftests/bpf: Add tests for BPF function " Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 10/11] selftests/bpf: Add negative test for greater-than-8-byte kfunc stack argument Yonghong Song
2026-04-05 16:54 ` [PATCH bpf-next v2 11/11] selftests/bpf: Add verifier tests for stack argument validation Yonghong Song
2026-04-05 17:08 ` Yonghong Song [this message]

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=2251a12b-2c2c-4222-935f-0629f44ecc8a@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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox