fix: kprobes: Use rethook for kretprobe if possible (v5.18)
authorMichael Jeanson <mjeanson@efficios.com>
Mon, 4 Apr 2022 19:02:10 +0000 (15:02 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 7 Apr 2022 19:18:51 +0000 (15:18 -0400)
See upstream commit :

  commit 73f9b911faa74ac5107879de05c9489c419f41bb
  Author: Masami Hiramatsu <mhiramat@kernel.org>
  Date:   Sat Mar 26 11:27:05 2022 +0900

    kprobes: Use rethook for kretprobe if possible

    Use rethook for kretprobe function return hooking if the arch sets
    CONFIG_HAVE_RETHOOK=y. In this case, CONFIG_KRETPROBE_ON_RETHOOK is
    set to 'y' automatically, and the kretprobe internal data fields
    switches to use rethook. If not, it continues to use kretprobe
    specific function return hooks.

Change-Id: I2b7670dc04e4769c1e3c372582ad2f555f6d7a66
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/wrapper/kprobes.h
src/probes/lttng-kretprobes.c

index b546d615dce45a56142fa71b502c1ecd5fb5e619..51d32b7cc225981efb0bde2785b953bf3bc26d8b 100644 (file)
@@ -29,4 +29,21 @@ struct kretprobe *lttng_get_kretprobe(struct kretprobe_instance *ri)
 
 #endif /* LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,11,0) */
 
+
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,18,0))
+static inline
+unsigned long lttng_get_kretprobe_retaddr(struct kretprobe_instance *ri)
+{
+       return get_kretprobe_retaddr(ri);
+}
+
+#else
+
+static inline
+unsigned long lttng_get_kretprobe_retaddr(struct kretprobe_instance *ri)
+{
+       return (unsigned long) ri->ret_addr;
+}
+#endif
+
 #endif /* _LTTNG_WRAPPER_KPROBES_H */
index 5cb2e9537ebf6aa7594d5d4d9a125d76dfe49c5a..565df739047911509b5f8d963f256eec7729a28a 100644 (file)
@@ -81,7 +81,7 @@ int _lttng_kretprobes_handler(struct kretprobe_instance *krpi,
                int ret;
 
                payload.ip = (unsigned long) lttng_get_kretprobe(krpi)->kp.addr;
-               payload.parent_ip = (unsigned long) krpi->ret_addr;
+               payload.parent_ip = lttng_get_kretprobe_retaddr(krpi);
 
                lib_ring_buffer_ctx_init(&ctx, event_recorder, sizeof(payload),
                                         lttng_alignof(payload), &lttng_probe_ctx);
This page took 0.026835 seconds and 4 git commands to generate.