On Wed, Jan 11, 2023 at 2:13 AM Jiri Olsa <jolsa@xxxxxxxxxx> wrote: > > Currently we allow to load any tracing program as sleepable, > but BPF_TRACE_RAW_TP can't sleep. Making the check explicit > for tracing programs attach types, so sleepable BPF_TRACE_RAW_TP > will fail to load. > > Updating the verifier error to mention iter programs as well. > > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> Acked-by: Song Liu <song@xxxxxxxxxx> > --- > v2 changes: > - use bool for can_be_sleepable return value [Song] > - add tests [Song] > > kernel/bpf/verifier.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c > index fa4c911603e9..f20777c2a957 100644 > --- a/kernel/bpf/verifier.c > +++ b/kernel/bpf/verifier.c > @@ -16743,6 +16743,18 @@ BTF_ID(func, rcu_read_unlock_strict) > #endif > BTF_SET_END(btf_id_deny) > > +static bool can_be_sleepable(struct bpf_prog *prog) > +{ > + if (prog->type == BPF_PROG_TYPE_TRACING) { > + return prog->expected_attach_type == BPF_TRACE_FENTRY || > + prog->expected_attach_type == BPF_TRACE_FEXIT || > + prog->expected_attach_type == BPF_MODIFY_RETURN || > + prog->expected_attach_type == BPF_TRACE_ITER; > + } > + return prog->type == BPF_PROG_TYPE_LSM || > + prog->type == BPF_PROG_TYPE_KPROBE; > +} > + > static int check_attach_btf_id(struct bpf_verifier_env *env) > { > struct bpf_prog *prog = env->prog; > @@ -16761,9 +16773,8 @@ static int check_attach_btf_id(struct bpf_verifier_env *env) > return -EINVAL; > } > > - if (prog->aux->sleepable && prog->type != BPF_PROG_TYPE_TRACING && > - prog->type != BPF_PROG_TYPE_LSM && prog->type != BPF_PROG_TYPE_KPROBE) { > - verbose(env, "Only fentry/fexit/fmod_ret, lsm, and kprobe/uprobe programs can be sleepable\n"); > + if (prog->aux->sleepable && !can_be_sleepable(prog)) { > + verbose(env, "Only fentry/fexit/fmod_ret, lsm, iter and kprobe/uprobe programs can be sleepable\n"); > return -EINVAL; > } > > -- > 2.39.0 >