bpf: extract same_callsites() as utility function
authorEduard Zingerman <eddyz87@gmail.com>
Tue, 24 Oct 2023 00:09:12 +0000 (03:09 +0300)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 24 Oct 2023 04:49:31 +0000 (21:49 -0700)
Extract same_callsites() from clean_live_states() as a utility function.
This function would be used by the next patch in the set.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20231024000917.12153-3-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index e6232b5d3964c3f4c4986860ff558ae80ca6e12f..366029e484a05f2d6456c83d7ee78b23978c662c 100644 (file)
@@ -1830,6 +1830,20 @@ static struct bpf_verifier_state_list **explored_state(struct bpf_verifier_env *
        return &env->explored_states[(idx ^ state->callsite) % state_htab_size(env)];
 }
 
+static bool same_callsites(struct bpf_verifier_state *a, struct bpf_verifier_state *b)
+{
+       int fr;
+
+       if (a->curframe != b->curframe)
+               return false;
+
+       for (fr = a->curframe; fr >= 0; fr--)
+               if (a->frame[fr]->callsite != b->frame[fr]->callsite)
+                       return false;
+
+       return true;
+}
+
 static void update_branch_counts(struct bpf_verifier_env *env, struct bpf_verifier_state *st)
 {
        while (st) {
@@ -15909,18 +15923,14 @@ static void clean_live_states(struct bpf_verifier_env *env, int insn,
                              struct bpf_verifier_state *cur)
 {
        struct bpf_verifier_state_list *sl;
-       int i;
 
        sl = *explored_state(env, insn);
        while (sl) {
                if (sl->state.branches)
                        goto next;
                if (sl->state.insn_idx != insn ||
-                   sl->state.curframe != cur->curframe)
+                   !same_callsites(&sl->state, cur))
                        goto next;
-               for (i = 0; i <= cur->curframe; i++)
-                       if (sl->state.frame[i]->callsite != cur->frame[i]->callsite)
-                               goto next;
                clean_verifier_state(env, &sl->state);
 next:
                sl = sl->next;