aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Poimboeuf <jpoimboe@redhat.com>2016-09-16 15:18:15 -0400
committerIngo Molnar <mingo@kernel.org>2016-09-20 02:29:34 -0400
commitec2ad9ccf12dc965cad2d367a4063f68d6561a6b (patch)
treedfe9ed376fc02b0fd8b12eb48c77fd5a35257633
parent49a612c6b06defbd6e6d334c683fea28006728e3 (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.c39
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>
20static int backtrace_stack(void *data, const char *name)
21{
22 /* Yes, we want all stacks */
23 return 0;
24}
25
26static 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
35static 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
42static struct stack_frame_ia32 * 22static 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