mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02: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,
 | 
					static int propagate_liveness(struct bpf_verifier_env *env,
 | 
				
			||||||
			      const struct bpf_verifier_state *vstate,
 | 
								      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_reg_state *state_reg, *parent_reg;
 | 
				
			||||||
	struct bpf_func_state *state, *parent;
 | 
						struct bpf_func_state *state, *parent;
 | 
				
			||||||
	int i, frame, err = 0;
 | 
						int i, frame, err = 0;
 | 
				
			||||||
 | 
						bool tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						changed = changed ?: &tmp;
 | 
				
			||||||
	if (vparent->curframe != vstate->curframe) {
 | 
						if (vparent->curframe != vstate->curframe) {
 | 
				
			||||||
		WARN(1, "propagate_live: parent frame %d current frame %d\n",
 | 
							WARN(1, "propagate_live: parent frame %d current frame %d\n",
 | 
				
			||||||
		     vparent->curframe, vstate->curframe);
 | 
							     vparent->curframe, vstate->curframe);
 | 
				
			||||||
| 
						 | 
					@ -18880,6 +18883,7 @@ static int propagate_liveness(struct bpf_verifier_env *env,
 | 
				
			||||||
						     &parent_reg[i]);
 | 
											     &parent_reg[i]);
 | 
				
			||||||
			if (err < 0)
 | 
								if (err < 0)
 | 
				
			||||||
				return err;
 | 
									return err;
 | 
				
			||||||
 | 
								*changed |= err > 0;
 | 
				
			||||||
			if (err == REG_LIVE_READ64)
 | 
								if (err == REG_LIVE_READ64)
 | 
				
			||||||
				mark_insn_zext(env, &parent_reg[i]);
 | 
									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;
 | 
								state_reg = &state->stack[i].spilled_ptr;
 | 
				
			||||||
			err = propagate_liveness_reg(env, state_reg,
 | 
								err = propagate_liveness_reg(env, state_reg,
 | 
				
			||||||
						     parent_reg);
 | 
											     parent_reg);
 | 
				
			||||||
 | 
								*changed |= err > 0;
 | 
				
			||||||
			if (err < 0)
 | 
								if (err < 0)
 | 
				
			||||||
				return err;
 | 
									return err;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -19266,7 +19271,7 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx)
 | 
				
			||||||
			 * they'll be immediately forgotten as we're pruning
 | 
								 * they'll be immediately forgotten as we're pruning
 | 
				
			||||||
			 * this state and will pop a new one.
 | 
								 * 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
 | 
								/* if previous state reached the exit with precision and
 | 
				
			||||||
			 * current state is equivalent to it (except precision marks)
 | 
								 * current state is equivalent to it (except precision marks)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue