Skip to content

Commit 6b3f95c

Browse files
eddyz87Alexei Starovoitov
authored andcommitted
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent a8b96f6 commit 6b3f95c

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

kernel/bpf/verifier.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18856,12 +18856,15 @@ static int propagate_liveness_reg(struct bpf_verifier_env *env,
1885618856
*/
1885718857
static int propagate_liveness(struct bpf_verifier_env *env,
1885818858
const struct bpf_verifier_state *vstate,
18859-
struct bpf_verifier_state *vparent)
18859+
struct bpf_verifier_state *vparent,
18860+
bool *changed)
1886018861
{
1886118862
struct bpf_reg_state *state_reg, *parent_reg;
1886218863
struct bpf_func_state *state, *parent;
1886318864
int i, frame, err = 0;
18865+
bool tmp;
1886418866

18867+
changed = changed ?: &tmp;
1886518868
if (vparent->curframe != vstate->curframe) {
1886618869
WARN(1, "propagate_live: parent frame %d current frame %d\n",
1886718870
vparent->curframe, vstate->curframe);
@@ -18880,6 +18883,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
1888018883
&parent_reg[i]);
1888118884
if (err < 0)
1888218885
return err;
18886+
*changed |= err > 0;
1888318887
if (err == REG_LIVE_READ64)
1888418888
mark_insn_zext(env, &parent_reg[i]);
1888518889
}
@@ -18891,6 +18895,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
1889118895
state_reg = &state->stack[i].spilled_ptr;
1889218896
err = propagate_liveness_reg(env, state_reg,
1889318897
parent_reg);
18898+
*changed |= err > 0;
1889418899
if (err < 0)
1889518900
return err;
1889618901
}
@@ -19266,7 +19271,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
1926619271
* they'll be immediately forgotten as we're pruning
1926719272
* this state and will pop a new one.
1926819273
*/
19269-
err = propagate_liveness(env, &sl->state, cur);
19274+
err = propagate_liveness(env, &sl->state, cur, NULL);
1927019275

1927119276
/* if previous state reached the exit with precision and
1927219277
* current state is equivalent to it (except precision marks)

0 commit comments

Comments
 (0)