]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bpf: use compute_live_registers() info in clean_func_state
authorEduard Zingerman <eddyz87@gmail.com>
Fri, 19 Sep 2025 02:18:35 +0000 (19:18 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 19 Sep 2025 16:27:22 +0000 (09:27 -0700)
Prepare for bpf_reg_state->live field removal by leveraging
insn_aux_data->live_regs_before instead of bpf_reg_state->live in
compute_live_registers(). This is similar to logic in
func_states_equal(). No changes in verification performance for
selftests or sched_ext.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250918-callchain-sensitive-liveness-v3-2-c3cd27bacc60@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 47cec5c8abff79ab9bd658de201c3fa5901fa664..64186ea0839bed3cb95cde090a3426c0db184b91 100644 (file)
@@ -18489,15 +18489,16 @@ static bool check_scalar_ids(u32 old_id, u32 cur_id, struct bpf_idmap *idmap)
 }
 
 static void clean_func_state(struct bpf_verifier_env *env,
-                            struct bpf_func_state *st)
+                            struct bpf_func_state *st,
+                            u32 ip)
 {
+       u16 live_regs = env->insn_aux_data[ip].live_regs_before;
        enum bpf_reg_liveness live;
        int i, j;
 
        for (i = 0; i < BPF_REG_FP; i++) {
-               live = st->regs[i].live;
                /* liveness must not touch this register anymore */
-               if (!(live & REG_LIVE_READ))
+               if (!(live_regs & BIT(i)))
                        /* since the register is unused, clear its state
                         * to make further comparison simpler
                         */
@@ -18518,11 +18519,13 @@ static void clean_func_state(struct bpf_verifier_env *env,
 static void clean_verifier_state(struct bpf_verifier_env *env,
                                 struct bpf_verifier_state *st)
 {
-       int i;
+       int i, ip;
 
        st->cleaned = true;
-       for (i = 0; i <= st->curframe; i++)
-               clean_func_state(env, st->frame[i]);
+       for (i = 0; i <= st->curframe; i++) {
+               ip = frame_insn_idx(st, i);
+               clean_func_state(env, st->frame[i], ip);
+       }
 }
 
 /* the parentage chains form a tree.