Skip to content

Commit 574078b

Browse files
eddyz87Alexei Starovoitov
authored andcommitted
bpf: fix env->peak_states computation
Compute env->peak_states as a maximum value of sum of env->explored_states and env->free_list size. Signed-off-by: Eduard Zingerman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 408fcf9 commit 574078b

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

include/linux/bpf_verifier.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,8 @@ struct bpf_verifier_env {
772772
u32 peak_states;
773773
/* longest register parentage chain walked for liveness marking */
774774
u32 longest_mark_read_walk;
775+
u32 free_list_size;
776+
u32 explored_states_size;
775777
bpfptr_t fd_array;
776778

777779
/* bit mask to keep track of whether a register has been accessed

kernel/bpf/verifier.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,14 @@ static struct bpf_reference_state *find_lock_state(struct bpf_verifier_state *st
16091609
return NULL;
16101610
}
16111611

1612+
static void update_peak_states(struct bpf_verifier_env *env)
1613+
{
1614+
u32 cur_states;
1615+
1616+
cur_states = env->explored_states_size + env->free_list_size;
1617+
env->peak_states = max(env->peak_states, cur_states);
1618+
}
1619+
16121620
static void free_func_state(struct bpf_func_state *state)
16131621
{
16141622
if (!state)
@@ -1670,7 +1678,7 @@ static void maybe_free_verifier_state(struct bpf_verifier_env *env,
16701678
list_del(&sl->node);
16711679
free_verifier_state(&sl->state, false);
16721680
kfree(sl);
1673-
env->peak_states--;
1681+
env->free_list_size--;
16741682
sl = loop_entry_sl;
16751683
}
16761684
}
@@ -18858,6 +18866,8 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
1885818866
sl->in_free_list = true;
1885918867
list_del(&sl->node);
1886018868
list_add(&sl->node, &env->free_list);
18869+
env->free_list_size++;
18870+
env->explored_states_size--;
1886118871
maybe_free_verifier_state(env, sl);
1886218872
}
1886318873
}
@@ -18884,7 +18894,8 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
1888418894
if (!new_sl)
1888518895
return -ENOMEM;
1888618896
env->total_states++;
18887-
env->peak_states++;
18897+
env->explored_states_size++;
18898+
update_peak_states(env);
1888818899
env->prev_jmps_processed = env->jmps_processed;
1888918900
env->prev_insn_processed = env->insn_processed;
1889018901

0 commit comments

Comments
 (0)