diff options
| -rw-r--r-- | arch/x86/include/asm/stacktrace.h | 18 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack.h | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack_32.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/dumpstack_64.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/stacktrace.c | 18 | ||||
| -rw-r--r-- | arch/x86/oprofile/backtrace.c | 9 | ||||
| -rw-r--r-- | kernel/trace/trace_sysprof.c | 1 |
9 files changed, 43 insertions, 25 deletions
diff --git a/arch/x86/include/asm/stacktrace.h b/arch/x86/include/asm/stacktrace.h index cf86a5e73815..6c75151a3cca 100644 --- a/arch/x86/include/asm/stacktrace.h +++ b/arch/x86/include/asm/stacktrace.h | |||
| @@ -5,6 +5,23 @@ extern int kstack_depth_to_print; | |||
| 5 | 5 | ||
| 6 | int x86_is_stack_id(int id, char *name); | 6 | int x86_is_stack_id(int id, char *name); |
| 7 | 7 | ||
| 8 | struct thread_info; | ||
| 9 | struct stacktrace_ops; | ||
| 10 | |||
| 11 | typedef unsigned long (*walk_stack_t)(struct thread_info *tinfo, | ||
| 12 | unsigned long *stack, | ||
| 13 | unsigned long bp, | ||
| 14 | const struct stacktrace_ops *ops, | ||
| 15 | void *data, | ||
| 16 | unsigned long *end, | ||
| 17 | int *graph); | ||
| 18 | |||
| 19 | extern unsigned long | ||
| 20 | print_context_stack(struct thread_info *tinfo, | ||
| 21 | unsigned long *stack, unsigned long bp, | ||
| 22 | const struct stacktrace_ops *ops, void *data, | ||
| 23 | unsigned long *end, int *graph); | ||
| 24 | |||
| 8 | /* Generic stack tracer with callbacks */ | 25 | /* Generic stack tracer with callbacks */ |
| 9 | 26 | ||
| 10 | struct stacktrace_ops { | 27 | struct stacktrace_ops { |
| @@ -14,6 +31,7 @@ struct stacktrace_ops { | |||
| 14 | void (*address)(void *data, unsigned long address, int reliable); | 31 | void (*address)(void *data, unsigned long address, int reliable); |
| 15 | /* On negative return stop dumping */ | 32 | /* On negative return stop dumping */ |
| 16 | int (*stack)(void *data, char *name); | 33 | int (*stack)(void *data, char *name); |
| 34 | walk_stack_t walk_stack; | ||
| 17 | }; | 35 | }; |
| 18 | 36 | ||
| 19 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, | 37 | void dump_trace(struct task_struct *tsk, struct pt_regs *regs, |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 45506d5dd8df..d3802ee5a416 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -2336,6 +2336,7 @@ static const struct stacktrace_ops backtrace_ops = { | |||
| 2336 | .warning_symbol = backtrace_warning_symbol, | 2336 | .warning_symbol = backtrace_warning_symbol, |
| 2337 | .stack = backtrace_stack, | 2337 | .stack = backtrace_stack, |
| 2338 | .address = backtrace_address, | 2338 | .address = backtrace_address, |
| 2339 | .walk_stack = print_context_stack, | ||
| 2339 | }; | 2340 | }; |
| 2340 | 2341 | ||
| 2341 | #include "../dumpstack.h" | 2342 | #include "../dumpstack.h" |
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 0a0aa1cec8f1..8aaa119b7cad 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c | |||
| @@ -141,10 +141,11 @@ static void print_trace_address(void *data, unsigned long addr, int reliable) | |||
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | static const struct stacktrace_ops print_trace_ops = { | 143 | static const struct stacktrace_ops print_trace_ops = { |
| 144 | .warning = print_trace_warning, | 144 | .warning = print_trace_warning, |
| 145 | .warning_symbol = print_trace_warning_symbol, | 145 | .warning_symbol = print_trace_warning_symbol, |
| 146 | .stack = print_trace_stack, | 146 | .stack = print_trace_stack, |
| 147 | .address = print_trace_address, | 147 | .address = print_trace_address, |
| 148 | .walk_stack = print_context_stack, | ||
| 148 | }; | 149 | }; |
| 149 | 150 | ||
| 150 | void | 151 | void |
diff --git a/arch/x86/kernel/dumpstack.h b/arch/x86/kernel/dumpstack.h index 81086c227ab7..4fd1420faffa 100644 --- a/arch/x86/kernel/dumpstack.h +++ b/arch/x86/kernel/dumpstack.h | |||
| @@ -14,12 +14,6 @@ | |||
| 14 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) | 14 | #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :) |
| 15 | #endif | 15 | #endif |
| 16 | 16 | ||
| 17 | extern unsigned long | ||
| 18 | print_context_stack(struct thread_info *tinfo, | ||
| 19 | unsigned long *stack, unsigned long bp, | ||
| 20 | const struct stacktrace_ops *ops, void *data, | ||
| 21 | unsigned long *end, int *graph); | ||
| 22 | |||
| 23 | extern void | 17 | extern void |
| 24 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | 18 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, |
| 25 | unsigned long *stack, unsigned long bp, char *log_lvl); | 19 | unsigned long *stack, unsigned long bp, char *log_lvl); |
diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c index e0ed4c7abb62..ae775ca47b25 100644 --- a/arch/x86/kernel/dumpstack_32.c +++ b/arch/x86/kernel/dumpstack_32.c | |||
| @@ -58,7 +58,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 58 | 58 | ||
| 59 | context = (struct thread_info *) | 59 | context = (struct thread_info *) |
| 60 | ((unsigned long)stack & (~(THREAD_SIZE - 1))); | 60 | ((unsigned long)stack & (~(THREAD_SIZE - 1))); |
| 61 | bp = print_context_stack(context, stack, bp, ops, data, NULL, &graph); | 61 | bp = ops->walk_stack(context, stack, bp, ops, data, NULL, &graph); |
| 62 | 62 | ||
| 63 | stack = (unsigned long *)context->previous_esp; | 63 | stack = (unsigned long *)context->previous_esp; |
| 64 | if (!stack) | 64 | if (!stack) |
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index b13af53883aa..0ad9597073f5 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -188,8 +188,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 188 | if (ops->stack(data, id) < 0) | 188 | if (ops->stack(data, id) < 0) |
| 189 | break; | 189 | break; |
| 190 | 190 | ||
| 191 | bp = print_context_stack(tinfo, stack, bp, ops, | 191 | bp = ops->walk_stack(tinfo, stack, bp, ops, |
| 192 | data, estack_end, &graph); | 192 | data, estack_end, &graph); |
| 193 | ops->stack(data, "<EOE>"); | 193 | ops->stack(data, "<EOE>"); |
| 194 | /* | 194 | /* |
| 195 | * We link to the next stack via the | 195 | * We link to the next stack via the |
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index c3eb207181fe..922eefbb3f6c 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
| @@ -53,17 +53,19 @@ save_stack_address_nosched(void *data, unsigned long addr, int reliable) | |||
| 53 | } | 53 | } |
| 54 | 54 | ||
| 55 | static const struct stacktrace_ops save_stack_ops = { | 55 | static const struct stacktrace_ops save_stack_ops = { |
| 56 | .warning = save_stack_warning, | 56 | .warning = save_stack_warning, |
| 57 | .warning_symbol = save_stack_warning_symbol, | 57 | .warning_symbol = save_stack_warning_symbol, |
| 58 | .stack = save_stack_stack, | 58 | .stack = save_stack_stack, |
| 59 | .address = save_stack_address, | 59 | .address = save_stack_address, |
| 60 | .walk_stack = print_context_stack, | ||
| 60 | }; | 61 | }; |
| 61 | 62 | ||
| 62 | static const struct stacktrace_ops save_stack_ops_nosched = { | 63 | static const struct stacktrace_ops save_stack_ops_nosched = { |
| 63 | .warning = save_stack_warning, | 64 | .warning = save_stack_warning, |
| 64 | .warning_symbol = save_stack_warning_symbol, | 65 | .warning_symbol = save_stack_warning_symbol, |
| 65 | .stack = save_stack_stack, | 66 | .stack = save_stack_stack, |
| 66 | .address = save_stack_address_nosched, | 67 | .address = save_stack_address_nosched, |
| 68 | .walk_stack = print_context_stack, | ||
| 67 | }; | 69 | }; |
| 68 | 70 | ||
| 69 | /* | 71 | /* |
diff --git a/arch/x86/oprofile/backtrace.c b/arch/x86/oprofile/backtrace.c index 044897be021f..3855096c59b8 100644 --- a/arch/x86/oprofile/backtrace.c +++ b/arch/x86/oprofile/backtrace.c | |||
| @@ -41,10 +41,11 @@ static void backtrace_address(void *data, unsigned long addr, int reliable) | |||
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | static struct stacktrace_ops backtrace_ops = { | 43 | static struct stacktrace_ops backtrace_ops = { |
| 44 | .warning = backtrace_warning, | 44 | .warning = backtrace_warning, |
| 45 | .warning_symbol = backtrace_warning_symbol, | 45 | .warning_symbol = backtrace_warning_symbol, |
| 46 | .stack = backtrace_stack, | 46 | .stack = backtrace_stack, |
| 47 | .address = backtrace_address, | 47 | .address = backtrace_address, |
| 48 | .walk_stack = print_context_stack, | ||
| 48 | }; | 49 | }; |
| 49 | 50 | ||
| 50 | struct frame_head { | 51 | struct frame_head { |
diff --git a/kernel/trace/trace_sysprof.c b/kernel/trace/trace_sysprof.c index f6693969287d..a7974a552ca9 100644 --- a/kernel/trace/trace_sysprof.c +++ b/kernel/trace/trace_sysprof.c | |||
| @@ -93,6 +93,7 @@ static const struct stacktrace_ops backtrace_ops = { | |||
| 93 | .warning_symbol = backtrace_warning_symbol, | 93 | .warning_symbol = backtrace_warning_symbol, |
| 94 | .stack = backtrace_stack, | 94 | .stack = backtrace_stack, |
| 95 | .address = backtrace_address, | 95 | .address = backtrace_address, |
| 96 | .walk_stack = print_context_stack, | ||
| 96 | }; | 97 | }; |
| 97 | 98 | ||
| 98 | static int | 99 | static int |
