diff options
| -rw-r--r-- | include/linux/stacktrace.h | 20 | ||||
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/stacktrace.c | 24 | ||||
| -rw-r--r-- | lib/Kconfig.debug | 6 | 
4 files changed, 50 insertions, 1 deletions
diff --git a/include/linux/stacktrace.h b/include/linux/stacktrace.h new file mode 100644 index 000000000000..9cc81e572224 --- /dev/null +++ b/include/linux/stacktrace.h  | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | #ifndef __LINUX_STACKTRACE_H | ||
| 2 | #define __LINUX_STACKTRACE_H | ||
| 3 | |||
| 4 | #ifdef CONFIG_STACKTRACE | ||
| 5 | struct stack_trace { | ||
| 6 | unsigned int nr_entries, max_entries; | ||
| 7 | unsigned long *entries; | ||
| 8 | }; | ||
| 9 | |||
| 10 | extern void save_stack_trace(struct stack_trace *trace, | ||
| 11 | struct task_struct *task, int all_contexts, | ||
| 12 | unsigned int skip); | ||
| 13 | |||
| 14 | extern void print_stack_trace(struct stack_trace *trace, int spaces); | ||
| 15 | #else | ||
| 16 | # define save_stack_trace(trace, task, all, skip) do { } while (0) | ||
| 17 | # define print_stack_trace(trace) do { } while (0) | ||
| 18 | #endif | ||
| 19 | |||
| 20 | #endif | ||
diff --git a/kernel/Makefile b/kernel/Makefile index 82fb182f6f61..e7fd20e70f1b 100644 --- a/kernel/Makefile +++ b/kernel/Makefile  | |||
| @@ -10,6 +10,7 @@ obj-y = sched.o fork.o exec_domain.o panic.o printk.o profile.o \ | |||
| 10 | kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ | 10 | kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ | 
| 11 | hrtimer.o | 11 | hrtimer.o | 
| 12 | 12 | ||
| 13 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | ||
| 13 | obj-y += time/ | 14 | obj-y += time/ | 
| 14 | obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o | 15 | obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o | 
| 15 | obj-$(CONFIG_FUTEX) += futex.o | 16 | obj-$(CONFIG_FUTEX) += futex.o | 
diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c new file mode 100644 index 000000000000..b71816e47a30 --- /dev/null +++ b/kernel/stacktrace.c  | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | /* | ||
| 2 | * kernel/stacktrace.c | ||
| 3 | * | ||
| 4 | * Stack trace management functions | ||
| 5 | * | ||
| 6 | * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | ||
| 7 | */ | ||
| 8 | #include <linux/sched.h> | ||
| 9 | #include <linux/kallsyms.h> | ||
| 10 | #include <linux/stacktrace.h> | ||
| 11 | |||
| 12 | void print_stack_trace(struct stack_trace *trace, int spaces) | ||
| 13 | { | ||
| 14 | int i, j; | ||
| 15 | |||
| 16 | for (i = 0; i < trace->nr_entries; i++) { | ||
| 17 | unsigned long ip = trace->entries[i]; | ||
| 18 | |||
| 19 | for (j = 0; j < spaces + 1; j++) | ||
| 20 | printk(" "); | ||
| 21 | print_ip_sym(ip); | ||
| 22 | } | ||
| 23 | } | ||
| 24 | |||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 7b3863d4f5e8..04e374c6fd46 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug  | |||
| @@ -107,7 +107,7 @@ config DEBUG_SLAB_LEAK | |||
| 107 | 107 | ||
| 108 | config DEBUG_PREEMPT | 108 | config DEBUG_PREEMPT | 
| 109 | bool "Debug preemptible kernel" | 109 | bool "Debug preemptible kernel" | 
| 110 | depends on DEBUG_KERNEL && PREEMPT | 110 | depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT | 
| 111 | default y | 111 | default y | 
| 112 | help | 112 | help | 
| 113 | If you say Y here then the kernel will use a debug variant of the | 113 | If you say Y here then the kernel will use a debug variant of the | 
| @@ -149,6 +149,10 @@ config DEBUG_SPINLOCK_SLEEP | |||
| 149 | If you say Y here, various routines which may sleep will become very | 149 | If you say Y here, various routines which may sleep will become very | 
| 150 | noisy if they are called with a spinlock held. | 150 | noisy if they are called with a spinlock held. | 
| 151 | 151 | ||
| 152 | config STACKTRACE | ||
| 153 | bool | ||
| 154 | depends on STACKTRACE_SUPPORT | ||
| 155 | |||
| 152 | config DEBUG_KOBJECT | 156 | config DEBUG_KOBJECT | 
| 153 | bool "kobject debugging" | 157 | bool "kobject debugging" | 
| 154 | depends on DEBUG_KERNEL | 158 | depends on DEBUG_KERNEL | 
