]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Prepare architecture JIT support for stack arguments
authorYonghong Song <yonghong.song@linux.dev>
Wed, 13 May 2026 04:50:54 +0000 (21:50 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 13 May 2026 16:27:31 +0000 (09:27 -0700)
Add bpf_jit_supports_stack_args() as a weak function defaulting to
false. Architectures that implement JIT support for stack arguments
override it to return true.

Reject BPF functions with more than 5 parameters at verification
time if the architecture does not support stack arguments.

Acked-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20260513045054.2390945-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/filter.h
kernel/bpf/btf.c
kernel/bpf/core.c

index 918d9b34eac6a4b61aba3787addf8f63484d0ae7..a515a9769078e5bfa04832a40b0dc8d7343b1766 100644 (file)
@@ -1184,6 +1184,7 @@ bool bpf_jit_inlines_helper_call(s32 imm);
 bool bpf_jit_supports_subprog_tailcalls(void);
 bool bpf_jit_supports_percpu_insn(void);
 bool bpf_jit_supports_kfunc_call(void);
+bool bpf_jit_supports_stack_args(void);
 bool bpf_jit_supports_far_kfunc_call(void);
 bool bpf_jit_supports_exceptions(void);
 bool bpf_jit_supports_ptr_xchg(void);
index 4fb8641546b8d24e37c3445cb6282beadf37ff65..17d4ab0a82068596cc17dd52cee46107d70f233f 100644 (file)
@@ -7870,8 +7870,14 @@ int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog)
                        MAX_BPF_FUNC_ARGS, tname, nargs);
                return -EFAULT;
        }
-       if (nargs > MAX_BPF_FUNC_REG_ARGS)
+       if (nargs > MAX_BPF_FUNC_REG_ARGS) {
+               if (!bpf_jit_supports_stack_args()) {
+                       bpf_log(log, "JIT does not support function %s() with %d args\n",
+                               tname, nargs);
+                       return -EFAULT;
+               }
                sub->stack_arg_cnt = nargs - MAX_BPF_FUNC_REG_ARGS;
+       }
 
        if (is_global && nargs > MAX_BPF_FUNC_REG_ARGS) {
                bpf_log(log, "global function %s has %d > %d args, stack args not supported\n",
index 958d86f0beac3c8d4f89032a6cf0bd1246b79f36..e6b836f846ebf7ff7db37b421040a3fc2b0e30a7 100644 (file)
@@ -3217,6 +3217,11 @@ bool __weak bpf_jit_supports_kfunc_call(void)
        return false;
 }
 
+bool __weak bpf_jit_supports_stack_args(void)
+{
+       return false;
+}
+
 bool __weak bpf_jit_supports_far_kfunc_call(void)
 {
        return false;