Message ID | 161639532235.895304.18329540036405219298.stgit@devnote2 (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | kprobes: Fix stacktrace with kretprobes on x86 | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Not a local patch |
On Mon, 22 Mar 2021 15:42:02 +0900 Masami Hiramatsu <mhiramat@kernel.org> wrote: > ftrace shows "[unknown/kretprobe'd]" indicator all addresses in the > kretprobe_trampoline, but the modified address by kretprobe should > be only kretprobe_trampoline+0. > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> -- Steve
Hi Steve, On Mon, 22 Mar 2021 11:11:42 -0400 Steven Rostedt <rostedt@goodmis.org> wrote: > On Mon, 22 Mar 2021 15:42:02 +0900 > Masami Hiramatsu <mhiramat@kernel.org> wrote: > > > ftrace shows "[unknown/kretprobe'd]" indicator all addresses in the > > kretprobe_trampoline, but the modified address by kretprobe should > > be only kretprobe_trampoline+0. > > > > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> > > Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org> Thank you for the Ack! > > -- Steve >
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 61255bad7e01..e12437388686 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -8,6 +8,7 @@ #include <linux/module.h> #include <linux/mutex.h> #include <linux/ftrace.h> +#include <linux/kprobes.h> #include <linux/sched/clock.h> #include <linux/sched/mm.h> @@ -346,22 +347,12 @@ int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...) } EXPORT_SYMBOL_GPL(trace_output_call); -#ifdef CONFIG_KRETPROBES -static inline const char *kretprobed(const char *name) +static inline const char *kretprobed(const char *name, unsigned long addr) { - static const char tramp_name[] = "kretprobe_trampoline"; - int size = sizeof(tramp_name); - - if (strncmp(tramp_name, name, size) == 0) + if (is_kretprobe_trampoline(addr)) return "[unknown/kretprobe'd]"; return name; } -#else -static inline const char *kretprobed(const char *name) -{ - return name; -} -#endif /* CONFIG_KRETPROBES */ void trace_seq_print_sym(struct trace_seq *s, unsigned long address, bool offset) @@ -374,7 +365,7 @@ trace_seq_print_sym(struct trace_seq *s, unsigned long address, bool offset) sprint_symbol(str, address); else kallsyms_lookup(address, NULL, NULL, NULL, str); - name = kretprobed(str); + name = kretprobed(str, address); if (name && strlen(name)) { trace_seq_puts(s, name);
ftrace shows "[unknown/kretprobe'd]" indicator all addresses in the kretprobe_trampoline, but the modified address by kretprobe should be only kretprobe_trampoline+0. Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> --- kernel/trace/trace_output.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)