[PATCH bpf-next v4 2/6] bpf: Rely on callback frame initialization defaults
From: Ihor Solodrai
Date: Fri Nov 13 2026 - 16:40:24 EST
Both callback entry paths call init_func_state(), which initializes all
registers to NOT_INIT and the callback return range to zero.
Callback setters repeat resets for unused registers, and the timer setter
repeats the default return range. Leave those defaults to frame
initialization and set only arguments and callback-specific state in the
setters.
No functional change.
Signed-off-by: Ihor Solodrai <ihor.solodrai@xxxxxxxxx>
---
kernel/bpf/verifier.c | 31 -------------------------------
1 file changed, 31 deletions(-)
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index a3d4a2d6de6a..3462e9b50d66 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -12242,9 +12242,6 @@ int map_set_for_each_callback_args(struct bpf_verifier_env *env,
/* pointer to stack or null */
callee->regs[BPF_REG_4] = caller->regs[BPF_REG_3];
-
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
return 0;
}
@@ -12313,11 +12310,6 @@ static int set_loop_callback_state(struct bpf_verifier_env *env,
callee->regs[BPF_REG_1].type = SCALAR_VALUE;
callee->regs[BPF_REG_2] = caller->regs[BPF_REG_3];
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_3]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
-
callee->in_callback_fn = true;
callee->callback_ret_range = retval_range(0, 1);
return 0;
@@ -12336,11 +12328,7 @@ static int set_timer_callback_state(struct bpf_verifier_env *env,
mark_map_callback_reg(&callee->regs[BPF_REG_3], &caller->regs[BPF_REG_1], PTR_TO_MAP_VALUE);
callee->regs[BPF_REG_3].id = ++env->id_gen;
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
callee->in_async_callback_fn = true;
- callee->callback_ret_range = retval_range(0, 0);
return 0;
}
@@ -12363,10 +12351,6 @@ static int set_find_vma_callback_state(struct bpf_verifier_env *env,
/* pointer to stack or null */
callee->regs[BPF_REG_3] = caller->regs[BPF_REG_4];
-
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
callee->in_callback_fn = true;
/* bpf_find_vma() runs the callback under mmap_lock and RCU. */
callee->in_rcu_callback_fn = true;
@@ -12383,15 +12367,9 @@ static int set_user_ringbuf_callback_state(struct bpf_verifier_env *env,
* callback_ctx, u64 flags);
* callback_fn(const struct bpf_dynptr_t* dynptr, void *callback_ctx);
*/
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_0]);
mark_dynptr_cb_reg(env, &callee->regs[BPF_REG_1], BPF_DYNPTR_TYPE_LOCAL);
callee->regs[BPF_REG_2] = caller->regs[BPF_REG_3];
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_3]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
-
callee->in_callback_fn = true;
callee->callback_ret_range = retval_range(0, 1);
return 0;
@@ -12422,9 +12400,6 @@ static int set_rbtree_add_callback_state(struct bpf_verifier_env *env,
mark_reg_graph_node(callee->regs, BPF_REG_2, &field->graph_root);
ref_set_non_owning(env, &callee->regs[BPF_REG_2]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_3]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
callee->in_callback_fn = true;
callee->callback_ret_range = retval_range(0, 1);
return 0;
@@ -12443,9 +12418,6 @@ static int set_task_work_schedule_callback_state(struct bpf_verifier_env *env,
mark_map_callback_reg(&callee->regs[BPF_REG_3], &caller->regs[BPF_REG_3], PTR_TO_MAP_VALUE);
callee->regs[BPF_REG_3].id = ++env->id_gen;
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
callee->in_async_callback_fn = true;
callee->callback_ret_range = retval_range(S32_MIN, S32_MAX);
return 0;
@@ -12463,9 +12435,6 @@ static int set_rcu_callback_state(struct bpf_verifier_env *env,
mark_map_callback_reg(&callee->regs[BPF_REG_2], &caller->regs[BPF_REG_2], PTR_TO_MAP_KEY);
mark_map_callback_reg(&callee->regs[BPF_REG_3], &caller->regs[BPF_REG_2], PTR_TO_MAP_VALUE);
- /* unused */
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_4]);
- bpf_mark_reg_not_init(env, &callee->regs[BPF_REG_5]);
callee->in_async_callback_fn = true;
callee->callback_ret_range = retval_range(S32_MIN, S32_MAX);
return 0;
--
2.56.0