]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: include backedges in peak_states stat
authorEduard Zingerman <eddyz87@gmail.com>
Wed, 11 Jun 2025 20:08:35 +0000 (13:08 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 12 Jun 2025 23:52:43 +0000 (16:52 -0700)
Count states accumulated in bpf_scc_visit->backedges in
env->peak_states.

Signed-off-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/r/20250611200836.4135542-10-eddyz87@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf_verifier.h
kernel/bpf/verifier.c

index 1ae588679e20467d9be941fab0035cd367d27dc3..7e459e839f8b4d3abb76fe025f64d701decf3368 100644 (file)
@@ -733,6 +733,7 @@ struct bpf_scc_visit {
         */
        struct bpf_verifier_state *entry_state;
        struct bpf_scc_backedge *backedges; /* list of backedges */
+       u32 num_backedges;
 };
 
 /* An array of bpf_scc_visit structs sharing tht same bpf_scc_callchain->scc
@@ -822,6 +823,7 @@ struct bpf_verifier_env {
        u32 longest_mark_read_walk;
        u32 free_list_size;
        u32 explored_states_size;
+       u32 num_backedges;
        bpfptr_t fd_array;
 
        /* bit mask to keep track of whether a register has been accessed
index 48847f8da5b1d06c24a5b55db7731b0e0b08f60a..1d3277bf935e513d711081985a1d77bf3ec1ae7c 100644 (file)
@@ -1648,7 +1648,7 @@ static void update_peak_states(struct bpf_verifier_env *env)
 {
        u32 cur_states;
 
-       cur_states = env->explored_states_size + env->free_list_size;
+       cur_states = env->explored_states_size + env->free_list_size + env->num_backedges;
        env->peak_states = max(env->peak_states, cur_states);
 }
 
@@ -1949,6 +1949,9 @@ static int maybe_exit_scc(struct bpf_verifier_env *env, struct bpf_verifier_stat
        if (env->log.level & BPF_LOG_LEVEL2)
                verbose(env, "SCC exit %s\n", format_callchain(env, &callchain));
        visit->entry_state = NULL;
+       env->num_backedges -= visit->num_backedges;
+       visit->num_backedges = 0;
+       update_peak_states(env);
        return propagate_backedges(env, visit);
 }
 
@@ -1977,6 +1980,9 @@ static int add_scc_backedge(struct bpf_verifier_env *env,
                verbose(env, "SCC backedge %s\n", format_callchain(env, &callchain));
        backedge->next = visit->backedges;
        visit->backedges = backedge;
+       visit->num_backedges++;
+       env->num_backedges++;
+       update_peak_states(env);
        return 0;
 }