]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: set 'changed' status if propagate_liveness() did any updates
authorEduard Zingerman <eddyz87@gmail.com>
Wed, 11 Jun 2025 20:08:31 +0000 (13:08 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 12 Jun 2025 23:52:43 +0000 (16:52 -0700)
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>
kernel/bpf/verifier.c

index b00769ceef8cc11643debb28868e9f362629fac6..e49bdce050491b22534bb084e111b6e367d936cc 100644 (file)
@@ -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)