]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: Clean up redundant stack arg checks for non-JITed programs
authorYonghong Song <yonghong.song@linux.dev>
Fri, 15 May 2026 22:51:01 +0000 (15:51 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Sun, 17 May 2026 00:46:16 +0000 (17:46 -0700)
Remove a redundant stack_arg_cnt check in __bpf_prog_select_runtime()
and start the stack arg loop from index 0 in bpf_fixup_call_args().
Both changes are no-ops that simplify the code:

In __bpf_prog_select_runtime(), the subprog_info[0].stack_arg_cnt
check is unreachable:
  - when there is only a main program (no bpf-to-bpf calls),
    subprog_info[0].stack_arg_cnt is always 0 because the main
    program's arg_cnt is forced to 1
  - when bpf-to-bpf calls use stack args and JIT succeeds,
    fp->bpf_func is set and this code is skipped
  - when JIT fails, bpf_fixup_call_args() rejects the program
    before we get to __bpf_prog_select_runtime().

In bpf_fixup_call_args(), starting the loop at i=1 skipped subprog 0,
which is safe since the main program always has arg_cnt=1 and thus
bpf_in_stack_arg_cnt() returns 0. Starting at i=0 removes the need
to reason about this invariant.

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20260515225101.824054-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/core.c
kernel/bpf/fixups.c

index 427a6d828e018560ab47f30dba2e864c1aceeb95..cdbe9fdf474f4c957bbd84a99305192de97030b9 100644 (file)
@@ -2609,7 +2609,7 @@ struct bpf_prog *__bpf_prog_select_runtime(struct bpf_verifier_env *env, struct
                goto finalize;
 
        if (IS_ENABLED(CONFIG_BPF_JIT_ALWAYS_ON) ||
-           bpf_prog_has_kfunc_call(fp) || (env && env->subprog_info[0].stack_arg_cnt))
+           bpf_prog_has_kfunc_call(fp))
                jit_needed = true;
 
        if (!bpf_prog_select_interpreter(fp))
index 19056016eed8b4b6bddb22aa2ec22a37304dc689..2cec4e8cd4a0e1c75f46df565d6c189cc7d6fd01 100644 (file)
@@ -1407,7 +1407,7 @@ int bpf_fixup_call_args(struct bpf_verifier_env *env)
                verbose(env, "calling kernel functions are not allowed in non-JITed programs\n");
                return -EINVAL;
        }
-       for (i = 1; i < env->subprog_cnt; i++) {
+       for (i = 0; i < env->subprog_cnt; i++) {
                if (bpf_in_stack_arg_cnt(&env->subprog_info[i])) {
                        verbose(env, "stack args are not supported in non-JITed programs\n");
                        return -EINVAL;