aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/bpf
diff options
context:
space:
mode:
authorEduard Zingerman <eddyz87@gmail.com>2025-02-15 03:04:01 -0800
committerAlexei Starovoitov <ast@kernel.org>2025-02-18 19:22:59 -0800
commit574078b001cdf6dfa4cf8a2f7373a9babdcc26c7 (patch)
treed1004305f5a3fea4cae16a5bec4f3d45fdab0292 /kernel/bpf
parentbpf: free verifier states when they are no longer referenced (diff)
downloadlinux-574078b001cdf6dfa4cf8a2f7373a9babdcc26c7.tar.gz
linux-574078b001cdf6dfa4cf8a2f7373a9babdcc26c7.zip
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 <eddyz87@gmail.com> Link: https://lore.kernel.org/r/20250215110411.3236773-11-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Diffstat (limited to 'kernel/bpf')
-rw-r--r--kernel/bpf/verifier.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 1d1f6a5902d8..e57b7c949860 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -1609,6 +1609,14 @@ static struct bpf_reference_state *find_lock_state(struct bpf_verifier_state *st
return NULL;
}
+static void update_peak_states(struct bpf_verifier_env *env)
+{
+ u32 cur_states;
+
+ cur_states = env->explored_states_size + env->free_list_size;
+ env->peak_states = max(env->peak_states, cur_states);
+}
+
static void free_func_state(struct bpf_func_state *state)
{
if (!state)
@@ -1670,7 +1678,7 @@ static void maybe_free_verifier_state(struct bpf_verifier_env *env,
list_del(&sl->node);
free_verifier_state(&sl->state, false);
kfree(sl);
- env->peak_states--;
+ env->free_list_size--;
sl = loop_entry_sl;
}
}
@@ -18858,6 +18866,8 @@ miss:
sl->in_free_list = true;
list_del(&sl->node);
list_add(&sl->node, &env->free_list);
+ env->free_list_size++;
+ env->explored_states_size--;
maybe_free_verifier_state(env, sl);
}
}
@@ -18884,7 +18894,8 @@ miss:
if (!new_sl)
return -ENOMEM;
env->total_states++;
- env->peak_states++;
+ env->explored_states_size++;
+ update_peak_states(env);
env->prev_jmps_processed = env->jmps_processed;
env->prev_insn_processed = env->insn_processed;