Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpf: include backedges in peak_states stat

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>

authored by

Eduard Zingerman and committed by
Alexei Starovoitov
0f54ff54 0e0da5f9

+9 -1
+2
include/linux/bpf_verifier.h
··· 733 733 */ 734 734 struct bpf_verifier_state *entry_state; 735 735 struct bpf_scc_backedge *backedges; /* list of backedges */ 736 + u32 num_backedges; 736 737 }; 737 738 738 739 /* An array of bpf_scc_visit structs sharing tht same bpf_scc_callchain->scc ··· 823 822 u32 longest_mark_read_walk; 824 823 u32 free_list_size; 825 824 u32 explored_states_size; 825 + u32 num_backedges; 826 826 bpfptr_t fd_array; 827 827 828 828 /* bit mask to keep track of whether a register has been accessed
+7 -1
kernel/bpf/verifier.c
··· 1648 1648 { 1649 1649 u32 cur_states; 1650 1650 1651 - cur_states = env->explored_states_size + env->free_list_size; 1651 + cur_states = env->explored_states_size + env->free_list_size + env->num_backedges; 1652 1652 env->peak_states = max(env->peak_states, cur_states); 1653 1653 } 1654 1654 ··· 1949 1949 if (env->log.level & BPF_LOG_LEVEL2) 1950 1950 verbose(env, "SCC exit %s\n", format_callchain(env, &callchain)); 1951 1951 visit->entry_state = NULL; 1952 + env->num_backedges -= visit->num_backedges; 1953 + visit->num_backedges = 0; 1954 + update_peak_states(env); 1952 1955 return propagate_backedges(env, visit); 1953 1956 } 1954 1957 ··· 1980 1977 verbose(env, "SCC backedge %s\n", format_callchain(env, &callchain)); 1981 1978 backedge->next = visit->backedges; 1982 1979 visit->backedges = backedge; 1980 + visit->num_backedges++; 1981 + env->num_backedges++; 1982 + update_peak_states(env); 1983 1983 return 0; 1984 1984 } 1985 1985