On Thu, Apr 28, 2022 at 11:22 AM Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote: > > On Thu, Apr 28, 2022 at 9:54 AM Delyan Kratunov <delyank@xxxxxx> wrote: > > > > uprobe and kprobe programs have the same program type, KPROBE, which is > > currently not allowed to load sleepable programs. > > > > To avoid adding a new UPROBE type, we instead allow sleepable KPROBE > > programs to load and defer the is-it-actually-a-uprobe-program check > > to attachment time, where we're already validating the corresponding > > perf_event. > > > > A corollary of this patch is that you can now load a sleepable kprobe > > program but cannot attach it. > > > > Signed-off-by: Delyan Kratunov <delyank@xxxxxx> > > --- > > kernel/bpf/syscall.c | 8 ++++++++ > > kernel/bpf/verifier.c | 4 ++-- > > 2 files changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > > index e9e3e49c0eb7..3ce923f489d7 100644 > > --- a/kernel/bpf/syscall.c > > +++ b/kernel/bpf/syscall.c > > @@ -3009,6 +3009,14 @@ static int bpf_perf_link_attach(const union bpf_attr *attr, struct bpf_prog *pro > > } > > > > event = perf_file->private_data; > > + if (prog->aux->sleepable) { > > + if (!event->tp_event || (event->tp_event->flags & TRACE_EVENT_FL_UPROBE) == 0) { > > so far TRACE_EVENT_FL_UPROBE was contained to within kernel/trace so > far, maybe it's better to instead expose a helper function to check if > perf_event represents uprobe? or we can move prog->aux->sleepable check down into perf_event_set_bpf_prog(). Which is probably cleaner. We check other prog flags there.