diff options
Diffstat (limited to 'kernel/backtracetest.c')
| -rw-r--r-- | kernel/backtracetest.c | 65 | 
1 files changed, 54 insertions, 11 deletions
| diff --git a/kernel/backtracetest.c b/kernel/backtracetest.c index d1a7605c5b8f..a5e026bc45c4 100644 --- a/kernel/backtracetest.c +++ b/kernel/backtracetest.c @@ -10,30 +10,73 @@   * of the License.   */ +#include <linux/completion.h> +#include <linux/delay.h> +#include <linux/interrupt.h>  #include <linux/module.h>  #include <linux/sched.h> -#include <linux/delay.h> +#include <linux/stacktrace.h> + +static void backtrace_test_normal(void) +{ +	printk("Testing a backtrace from process context.\n"); +	printk("The following trace is a kernel self test and not a bug!\n"); -static struct timer_list backtrace_timer; +	dump_stack(); +} -static void backtrace_test_timer(unsigned long data) +static DECLARE_COMPLETION(backtrace_work); + +static void backtrace_test_irq_callback(unsigned long data) +{ +	dump_stack(); +	complete(&backtrace_work); +} + +static DECLARE_TASKLET(backtrace_tasklet, &backtrace_test_irq_callback, 0); + +static void backtrace_test_irq(void)  {  	printk("Testing a backtrace from irq context.\n");  	printk("The following trace is a kernel self test and not a bug!\n"); -	dump_stack(); + +	init_completion(&backtrace_work); +	tasklet_schedule(&backtrace_tasklet); +	wait_for_completion(&backtrace_work); +} + +#ifdef CONFIG_STACKTRACE +static void backtrace_test_saved(void) +{ +	struct stack_trace trace; +	unsigned long entries[8]; + +	printk("Testing a saved backtrace.\n"); +	printk("The following trace is a kernel self test and not a bug!\n"); + +	trace.nr_entries = 0; +	trace.max_entries = ARRAY_SIZE(entries); +	trace.entries = entries; +	trace.skip = 0; + +	save_stack_trace(&trace); +	print_stack_trace(&trace, 0); +} +#else +static void backtrace_test_saved(void) +{ +	printk("Saved backtrace test skipped.\n");  } +#endif +  static int backtrace_regression_test(void)  {  	printk("====[ backtrace testing ]===========\n"); -	printk("Testing a backtrace from process context.\n"); -	printk("The following trace is a kernel self test and not a bug!\n"); -	dump_stack(); -	init_timer(&backtrace_timer); -	backtrace_timer.function = backtrace_test_timer; -	mod_timer(&backtrace_timer, jiffies + 10); +	backtrace_test_normal(); +	backtrace_test_irq(); +	backtrace_test_saved(); -	msleep(10);  	printk("====[ end of backtrace testing ]====\n");  	return 0;  } | 
