Re: [RFC bpf-next 01/10] uprobe: Add session callbacks to uprobe_consumer

Jiri Olsa
2024-06-05T21:01:25Z

On Wed, Jun 05, 2024 at 10:25:56AM -0700, Andrii Nakryiko wrote:

SNIP

> > ---
> > include/linux/uprobes.h | 18 +++++++++++
> > kernel/events/uprobes.c | 69 +++++++++++++++++++++++++++++++++++------
> > 2 files changed, 78 insertions(+), 9 deletions(-)
> >
> > diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h
> > index f46e0ca0169c..a2f2d5ac3cee 100644
> > --- a/include/linux/uprobes.h
> > +++ b/include/linux/uprobes.h
> > @@ -34,6 +34,12 @@ enum uprobe_filter_ctx {
> > };
> >
> > struct uprobe_consumer {
> > + /*
> > + * The handler callback return value controls removal of the uprobe.
> > + * 0 on success, uprobe stays
> > + * 1 on failure, remove the uprobe
> > + * console warning for anything else
> > + */
> > int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs);
> > int (*ret_handler)(struct uprobe_consumer *self,
> > unsigned long func,
> > @@ -42,6 +48,17 @@ struct uprobe_consumer {
> > enum uprobe_filter_ctx ctx,
> > struct mm_struct *mm);
> >
> > + /* The handler_session callback return value controls execution of
> > + * the return uprobe and ret_handler_session callback.
> > + * 0 on success
> > + * 1 on failure, DO NOT install/execute the return uprobe
> > + * console warning for anything else
> > + */
> > + int (*handler_session)(struct uprobe_consumer *self, struct pt_regs *regs,
> > + unsigned long *data);
> > + int (*ret_handler_session)(struct uprobe_consumer *self, unsigned long func,
> > + struct pt_regs *regs, unsigned long *data);
> > +
>
> We should try to avoid an alternative set of callbacks, IMO. Let's
> extend existing ones with `unsigned long *data`, but specify that
> unless consumer sets some flag on registration that it needs a session
> cookie, we'll pass NULL here? Or just allocate cookie data for each
> registered consumer for simplicity, don't know; given we don't expect
> many consumers on exactly the same uprobe, it might be ok to keep it
> simple.
>

ah, I did not want to break existing users.. but it's not uapi,
so we're good, ok makes sense

jirka

>
> > struct uprobe_consumer *next;
> > };
> >
> > @@ -85,6 +102,7 @@ struct return_instance {
> > unsigned long func;
> > unsigned long stack; /* stack pointer */
> > unsigned long orig_ret_vaddr; /* original return address */
> > + unsigned long data;
> > bool chained; /* true, if instance is nested */
> >
> > struct return_instance *next; /* keep as stack */

SNIP