summaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/lttng/lttng-modules/0007-fix-kprobes-Use-rethook-for-kretprobe-if-possible-v5.patch
blob: effd37ffe13609f15bf9e1b03d482ed7a60f1851 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
From 3c46ddc134621dba65030263aa321dd6bdae3ba3 Mon Sep 17 00:00:00 2001
From: Michael Jeanson <mjeanson@efficios.com>
Date: Mon, 4 Apr 2022 15:02:10 -0400
Subject: [PATCH 07/10] fix: kprobes: Use rethook for kretprobe if possible
 (v5.18)

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.

Upstream-Status: Backport

Change-Id: I2b7670dc04e4769c1e3c372582ad2f555f6d7a66
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 include/wrapper/kprobes.h     | 17 +++++++++++++++++
 src/probes/lttng-kretprobes.c |  2 +-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/include/wrapper/kprobes.h b/include/wrapper/kprobes.h
index b546d615..51d32b7c 100644
--- a/include/wrapper/kprobes.h
+++ b/include/wrapper/kprobes.h
@@ -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 */
diff --git a/src/probes/lttng-kretprobes.c b/src/probes/lttng-kretprobes.c
index 5cb2e953..565df739 100644
--- a/src/probes/lttng-kretprobes.c
+++ b/src/probes/lttng-kretprobes.c
@@ -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);
-- 
2.19.1