Commit 6cd21eb9 authored by Eduard Zingerman's avatar Eduard Zingerman Committed by Alexei Starovoitov
Browse files

bpf: use compute_live_registers() info in clean_func_state



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: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250918-callchain-sensitive-liveness-v3-2-c3cd27bacc60@gmail.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent daf4c292
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -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.