]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
uprobe: Add data pointer to consumer handlers
authorJiri Olsa <jolsa@kernel.org>
Fri, 18 Oct 2024 20:22:51 +0000 (22:22 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 23 Oct 2024 18:52:27 +0000 (20:52 +0200)
Adding data pointer to both entry and exit consumer handlers and all
its users. The functionality itself is coming in following change.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20241018202252.693462-2-jolsa@kernel.org
include/linux/uprobes.h
kernel/events/uprobes.c
kernel/trace/bpf_trace.c
kernel/trace/trace_uprobe.c
tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c

index 2b294bf1881fef3cb1d05b9bf2d8862710cad8d1..bb265a632b9134ebae95ab06e13070c2ba245730 100644 (file)
@@ -37,10 +37,10 @@ struct uprobe_consumer {
         * for the current process. If filter() is omitted or returns true,
         * UPROBE_HANDLER_REMOVE is effectively ignored.
         */
-       int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs);
+       int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs, __u64 *data);
        int (*ret_handler)(struct uprobe_consumer *self,
                                unsigned long func,
-                               struct pt_regs *regs);
+                               struct pt_regs *regs, __u64 *data);
        bool (*filter)(struct uprobe_consumer *self, struct mm_struct *mm);
 
        struct list_head cons_node;
index 2a00594643835b4d3f3a0a4a5f1e6a2ae60023ff..6b44c386a5df87b2150b3c1bea458684a57f57dd 100644 (file)
@@ -2090,7 +2090,7 @@ static void handler_chain(struct uprobe *uprobe, struct pt_regs *regs)
                int rc = 0;
 
                if (uc->handler) {
-                       rc = uc->handler(uc, regs);
+                       rc = uc->handler(uc, regs, NULL);
                        WARN(rc & ~UPROBE_HANDLER_MASK,
                                "bad rc=0x%x from %ps()\n", rc, uc->handler);
                }
@@ -2128,7 +2128,7 @@ handle_uretprobe_chain(struct return_instance *ri, struct pt_regs *regs)
        rcu_read_lock_trace();
        list_for_each_entry_rcu(uc, &uprobe->consumers, cons_node, rcu_read_lock_trace_held()) {
                if (uc->ret_handler)
-                       uc->ret_handler(uc, ri->func, regs);
+                       uc->ret_handler(uc, ri->func, regs, NULL);
        }
        rcu_read_unlock_trace();
 }
index a582cd25ca876616a5ade9fbd719c4688e636d93..fdab7ecd8dfa068a09f8899d56cb90081b5fb812 100644 (file)
@@ -3244,7 +3244,8 @@ uprobe_multi_link_filter(struct uprobe_consumer *con, struct mm_struct *mm)
 }
 
 static int
-uprobe_multi_link_handler(struct uprobe_consumer *con, struct pt_regs *regs)
+uprobe_multi_link_handler(struct uprobe_consumer *con, struct pt_regs *regs,
+                         __u64 *data)
 {
        struct bpf_uprobe *uprobe;
 
@@ -3253,7 +3254,8 @@ uprobe_multi_link_handler(struct uprobe_consumer *con, struct pt_regs *regs)
 }
 
 static int
-uprobe_multi_link_ret_handler(struct uprobe_consumer *con, unsigned long func, struct pt_regs *regs)
+uprobe_multi_link_ret_handler(struct uprobe_consumer *con, unsigned long func, struct pt_regs *regs,
+                             __u64 *data)
 {
        struct bpf_uprobe *uprobe;
 
index c40531d2cbadde432d8cd0d231986b98e2b3490e..5895eabe35812819f51eeb583a708912f22d1d0c 100644 (file)
@@ -89,9 +89,11 @@ static struct trace_uprobe *to_trace_uprobe(struct dyn_event *ev)
 static int register_uprobe_event(struct trace_uprobe *tu);
 static int unregister_uprobe_event(struct trace_uprobe *tu);
 
-static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs);
+static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs,
+                            __u64 *data);
 static int uretprobe_dispatcher(struct uprobe_consumer *con,
-                               unsigned long func, struct pt_regs *regs);
+                               unsigned long func, struct pt_regs *regs,
+                               __u64 *data);
 
 #ifdef CONFIG_STACK_GROWSUP
 static unsigned long adjust_stack_addr(unsigned long addr, unsigned int n)
@@ -1517,7 +1519,8 @@ trace_uprobe_register(struct trace_event_call *event, enum trace_reg type,
        }
 }
 
-static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
+static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs,
+                            __u64 *data)
 {
        struct trace_uprobe *tu;
        struct uprobe_dispatch_data udd;
@@ -1548,7 +1551,8 @@ static int uprobe_dispatcher(struct uprobe_consumer *con, struct pt_regs *regs)
 }
 
 static int uretprobe_dispatcher(struct uprobe_consumer *con,
-                               unsigned long func, struct pt_regs *regs)
+                               unsigned long func, struct pt_regs *regs,
+                               __u64 *data)
 {
        struct trace_uprobe *tu;
        struct uprobe_dispatch_data udd;
index 8835761d9a126ad7a2e13c57e70fae96dcf8aa6f..12005e3dc3e4ef9b8d1df7d2c183f81f1ed5bd58 100644 (file)
@@ -461,7 +461,7 @@ static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = {
 
 static int
 uprobe_ret_handler(struct uprobe_consumer *self, unsigned long func,
-                  struct pt_regs *regs)
+                  struct pt_regs *regs, __u64 *data)
 
 {
        regs->ax  = 0x12345678deadbeef;