diff options
author | Josh Poimboeuf <jpoimboe@redhat.com> | 2016-09-16 15:18:15 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-09-20 02:29:34 -0400 |
commit | ec2ad9ccf12dc965cad2d367a4063f68d6561a6b (patch) | |
tree | dfe9ed376fc02b0fd8b12eb48c77fd5a35257633 | |
parent | 49a612c6b06defbd6e6d334c683fea28006728e3 (diff) |
oprofile/x86: Convert x86_backtrace() to use the new unwinder
Convert oprofile's x86_backtrace() to use the new unwinder.
dump_trace() has been deprecated.
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Byungchul Park <byungchul.park@lge.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Robert Richter <rric@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/412df8927705795e8ea60cffcf89a79e010713b1.1474045023.git.jpoimboe@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/x86/oprofile/backtrace.c | 39 |
1 files changed, 17 insertions, 22 deletions
diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c index 75391488130b..a2488b6e27d6 100644 --- a/arch/x86/oprofile/backtrace.c +++ b/arch/x86/oprofile/backtrace.c | |||
@@ -16,27 +16,7 @@ | |||
16 | 16 | ||
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include <asm/stacktrace.h> | 18 | #include <asm/stacktrace.h> |
19 | 19 | #include <asm/unwind.h> | |
20 | static int backtrace_stack(void *data, const char *name) | ||
21 | { | ||
22 | /* Yes, we want all stacks */ | ||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | static int backtrace_address(void *data, unsigned long addr, int reliable) | ||
27 | { | ||
28 | unsigned int *depth = data; | ||
29 | |||
30 | if ((*depth)--) | ||
31 | oprofile_add_trace(addr); | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | static struct stacktrace_ops backtrace_ops = { | ||
36 | .stack = backtrace_stack, | ||
37 | .address = backtrace_address, | ||
38 | .walk_stack = print_context_stack, | ||
39 | }; | ||
40 | 20 | ||
41 | #ifdef CONFIG_COMPAT | 21 | #ifdef CONFIG_COMPAT |
42 | static struct stack_frame_ia32 * | 22 | static struct stack_frame_ia32 * |
@@ -113,14 +93,29 @@ x86_backtrace(struct pt_regs * const regs, unsigned int depth) | |||
113 | struct stack_frame *head = (struct stack_frame *)frame_pointer(regs); | 93 | struct stack_frame *head = (struct stack_frame *)frame_pointer(regs); |
114 | 94 | ||
115 | if (!user_mode(regs)) { | 95 | if (!user_mode(regs)) { |
96 | struct unwind_state state; | ||
97 | unsigned long addr; | ||
98 | |||
116 | if (!depth) | 99 | if (!depth) |
117 | return; | 100 | return; |
118 | 101 | ||
119 | oprofile_add_trace(regs->ip); | 102 | oprofile_add_trace(regs->ip); |
103 | |||
120 | if (!--depth) | 104 | if (!--depth) |
121 | return; | 105 | return; |
122 | 106 | ||
123 | dump_trace(NULL, regs, NULL, 0, &backtrace_ops, &depth); | 107 | for (unwind_start(&state, current, regs, NULL); |
108 | !unwind_done(&state); unwind_next_frame(&state)) { | ||
109 | addr = unwind_get_return_address(&state); | ||
110 | if (!addr) | ||
111 | break; | ||
112 | |||
113 | oprofile_add_trace(addr); | ||
114 | |||
115 | if (!--depth) | ||
116 | break; | ||
117 | } | ||
118 | |||
124 | return; | 119 | return; |
125 | } | 120 | } |
126 | 121 | ||