Re: [PATCH bpf-next v1 08/14] bpf: Report non-sleepable kfunc programs accurately
Eduard Zingerman <[email protected]>
| Newsgroups | org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
On Sun, 2026-08-16 at 03:57 +0200, Kumar Kartikeya Dwivedi wrote: Acked-by: Eduard Zingerman <[email protected]> ... > diff --git a/kernel/bpf/diagnostics.c b/kernel/bpf/diagnostics.c > index 2c475174a640..df9259fa0ea7 100644 > --- a/kernel/bpf/diagnostics.c > +++ b/kernel/bpf/diagnostics.c > @@ -1083,7 +1083,9 @@ void bpf_diag_ctx_forbidden(struct bpf_verifier_env *env, u32 insn_idx, > const char *constraint, *context; > u32 depth; > > - if (env->cur_state->active_rcu_locks) > + if (!env->cur_state->in_sleepable) > + ctx_kind = BPF_DIAG_CONTEXT_NONE; Let's do what bot suggests and rely on the final 'else' instead of adding this branch. > + else if (env->cur_state->active_rcu_locks) > ctx_kind = BPF_DIAG_CONTEXT_RCU; > else if (env->cur_state->active_preempt_locks) > ctx_kind = BPF_DIAG_CONTEXT_PREEMPT; > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > index da2ec0655b17..3de9e4f617b6 100644 > --- a/kernel/bpf/verifier.c > +++ b/kernel/bpf/verifier.c > @@ -9912,7 +9912,7 @@ static int check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn, > sub_name, non_sleepable_context_description(env)); > operation = bpf_diag_fmt(env, "sleepable global function %s()", sub_name); > bpf_diag_ctx_forbidden(env, *insn_idx, operation, > - "Move the call outside the critical section, or use a non-sleepable function."); > + "Call the function from a sleepable program outside any critical section, or use a non-sleepable function."); > return -EINVAL; > } > > @@ -10731,6 +10731,8 @@ static inline bool in_sleepable_context(struct bpf_verifier_env *env) > > static const char *non_sleepable_context_description(struct bpf_verifier_env *env) > { > + if (!in_sleepable(env)) > + return "non-sleepable prog"; Let's drop this hunk and rely on the `return "non-sleepable context"`. Not sure if we need to change 'prog' to 'context', tbh. > if (env->cur_state->active_rcu_locks) > return "rcu_read_lock region"; > if (env->cur_state->active_preempt_locks) > @@ -10739,7 +10741,7 @@ static const char *non_sleepable_context_description(struct bpf_verifier_env *en > return "IRQ-disabled region"; > if (env->cur_state->active_locks) > return "lock region"; > - return "non-sleepable prog"; > + return "non-sleepable context"; > } > > static int release_reg(struct bpf_verifier_env *env, struct bpf_reg_state *reg, ...