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;  int x86_is_stack_id(int id, char *name); +struct thread_info; +struct stacktrace_ops; + +typedef unsigned long (*walk_stack_t)(struct thread_info *tinfo, +				      unsigned long *stack, +				      unsigned long bp, +				      const struct stacktrace_ops *ops, +				      void *data, +				      unsigned long *end, +				      int *graph); + +extern unsigned long +print_context_stack(struct thread_info *tinfo, +		    unsigned long *stack, unsigned long bp, +		    const struct stacktrace_ops *ops, void *data, +		    unsigned long *end, int *graph); +  /* Generic stack tracer with callbacks */  struct stacktrace_ops { @@ -14,6 +31,7 @@ struct stacktrace_ops {  	void (*address)(void *data, unsigned long address, int reliable);  	/* On negative return stop dumping */  	int (*stack)(void *data, char *name); +	walk_stack_t	walk_stack;  };  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 = {  	.warning_symbol		= backtrace_warning_symbol,  	.stack			= backtrace_stack,  	.address		= backtrace_address, +	.walk_stack		= print_context_stack,  };  #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)  }  static const struct stacktrace_ops print_trace_ops = { -	.warning = print_trace_warning, -	.warning_symbol = print_trace_warning_symbol, -	.stack = print_trace_stack, -	.address = print_trace_address, +	.warning		= print_trace_warning, +	.warning_symbol		= print_trace_warning_symbol, +	.stack 			= print_trace_stack, +	.address 		= print_trace_address, +	.walk_stack		= print_context_stack,  };  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 @@  #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)  #endif -extern unsigned long -print_context_stack(struct thread_info *tinfo, -		unsigned long *stack, unsigned long bp, -		const struct stacktrace_ops *ops, void *data, -		unsigned long *end, int *graph); -  extern void  show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,  		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,  		context = (struct thread_info *)  			((unsigned long)stack & (~(THREAD_SIZE - 1))); -		bp = print_context_stack(context, stack, bp, ops, data, NULL, &graph); +		bp = ops->walk_stack(context, stack, bp, ops, data, NULL, &graph);  		stack = (unsigned long *)context->previous_esp;  		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,  			if (ops->stack(data, id) < 0)  				break; -			bp = print_context_stack(tinfo, stack, bp, ops, -						 data, estack_end, &graph); +			bp = ops->walk_stack(tinfo, stack, bp, ops, +					     data, estack_end, &graph);  			ops->stack(data, "<EOE>");  			/*  			 * 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)  }  static const struct stacktrace_ops save_stack_ops = { -	.warning = save_stack_warning, -	.warning_symbol = save_stack_warning_symbol, -	.stack = save_stack_stack, -	.address = save_stack_address, +	.warning	= save_stack_warning, +	.warning_symbol	= save_stack_warning_symbol, +	.stack		= save_stack_stack, +	.address	= save_stack_address, +	.walk_stack	= print_context_stack,  };  static const struct stacktrace_ops save_stack_ops_nosched = { -	.warning = save_stack_warning, -	.warning_symbol = save_stack_warning_symbol, -	.stack = save_stack_stack, -	.address = save_stack_address_nosched, +	.warning	= save_stack_warning, +	.warning_symbol	= save_stack_warning_symbol, +	.stack		= save_stack_stack, +	.address	= save_stack_address_nosched, +	.walk_stack	= print_context_stack,  };  /* 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)  }  static struct stacktrace_ops backtrace_ops = { -	.warning = backtrace_warning, -	.warning_symbol = backtrace_warning_symbol, -	.stack = backtrace_stack, -	.address = backtrace_address, +	.warning	= backtrace_warning, +	.warning_symbol	= backtrace_warning_symbol, +	.stack		= backtrace_stack, +	.address	= backtrace_address, +	.walk_stack	= print_context_stack,  };  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 = {  	.warning_symbol		= backtrace_warning_symbol,  	.stack			= backtrace_stack,  	.address		= backtrace_address, +	.walk_stack		= print_context_stack,  };  static int | 
