Thread (28 messages) 28 messages, 4 authors, 2024-06-19

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

From: Jiri Olsa <hidden>
Date: 2024-06-05 21:01:25
Also in: bpf, lkml

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

SNIP
quoted
---
 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
 
quoted
        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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help