mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
bpf: set 'changed' status if propagate_liveness() did any updates
Add an out parameter to `propagate_liveness()` to record whether any new liveness bits were set during its execution. Signed-off-by: Eduard Zingerman <eddyz87@gmail.com> Link: https://lore.kernel.org/r/20250611200836.4135542-6-eddyz87@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
23b37d6165
commit
dfb2d4c64b
1 changed files with 7 additions and 2 deletions
|
@ -18856,12 +18856,15 @@ static int propagate_liveness_reg(struct bpf_verifier_env *env,
|
|||
*/
|
||||
static int propagate_liveness(struct bpf_verifier_env *env,
|
||||
const struct bpf_verifier_state *vstate,
|
||||
struct bpf_verifier_state *vparent)
|
||||
struct bpf_verifier_state *vparent,
|
||||
bool *changed)
|
||||
{
|
||||
struct bpf_reg_state *state_reg, *parent_reg;
|
||||
struct bpf_func_state *state, *parent;
|
||||
int i, frame, err = 0;
|
||||
bool tmp;
|
||||
|
||||
changed = changed ?: &tmp;
|
||||
if (vparent->curframe != vstate->curframe) {
|
||||
WARN(1, "propagate_live: parent frame %d current frame %d\n",
|
||||
vparent->curframe, vstate->curframe);
|
||||
|
@ -18880,6 +18883,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
|
|||
&parent_reg[i]);
|
||||
if (err < 0)
|
||||
return err;
|
||||
*changed |= err > 0;
|
||||
if (err == REG_LIVE_READ64)
|
||||
mark_insn_zext(env, &parent_reg[i]);
|
||||
}
|
||||
|
@ -18891,6 +18895,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
|
|||
state_reg = &state->stack[i].spilled_ptr;
|
||||
err = propagate_liveness_reg(env, state_reg,
|
||||
parent_reg);
|
||||
*changed |= err > 0;
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
@ -19266,7 +19271,7 @@ hit:
|
|||
* they'll be immediately forgotten as we're pruning
|
||||
* this state and will pop a new one.
|
||||
*/
|
||||
err = propagate_liveness(env, &sl->state, cur);
|
||||
err = propagate_liveness(env, &sl->state, cur, NULL);
|
||||
|
||||
/* if previous state reached the exit with precision and
|
||||
* current state is equivalent to it (except precision marks)
|
||||
|
|
Loading…
Add table
Reference in a new issue