diff options
author | Ingo Molnar <mingo@elte.hu> | 2006-07-03 03:24:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-03 18:27:02 -0400 |
commit | 8637c09901049f061b94f684915d4f18ecf91d79 (patch) | |
tree | 83ca3ab38ab4d12f4e10176ba01ae33809388767 | |
parent | f0a5c315eb266edc608a29971bb4ff1a3025c58f (diff) |
[PATCH] lockdep: stacktrace subsystem, core
Framework to generate and save stacktraces quickly, without printing anything
to the console.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-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 |