diff options
author | Eric Sandeen <sandeen@sgi.com> | 2006-06-26 08:00:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:48:22 -0400 |
commit | 8501a2fbe762b21d2504ed3aca3b52be61b5e6e4 (patch) | |
tree | 899bf4085bb29927a71dd90b3ed1fb444ed4b0ea | |
parent | 4961f10e2205d0ededa291e12ec634efc58aa93c (diff) |
[PATCH] x86_64: x86_64 stack usage debugging
Applies to git & 2.6.17-rc6 after CONFIG_DEBUG_STACKOVERFLOW patch
uses same stack-zeroing mechanism as on i386 to discover maximum stack
excursions.
Signed-off-by: Eric Sandeen <sandeen@sgi.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | arch/x86_64/Kconfig.debug | 9 | ||||
-rw-r--r-- | include/asm-x86_64/thread_info.h | 13 |
2 files changed, 22 insertions, 0 deletions
diff --git a/arch/x86_64/Kconfig.debug b/arch/x86_64/Kconfig.debug index 087a04868b25..1d92ab56c0f9 100644 --- a/arch/x86_64/Kconfig.debug +++ b/arch/x86_64/Kconfig.debug | |||
@@ -42,6 +42,15 @@ config DEBUG_STACKOVERFLOW | |||
42 | This option will cause messages to be printed if free stack space | 42 | This option will cause messages to be printed if free stack space |
43 | drops below a certain limit. | 43 | drops below a certain limit. |
44 | 44 | ||
45 | config DEBUG_STACK_USAGE | ||
46 | bool "Stack utilization instrumentation" | ||
47 | depends on DEBUG_KERNEL | ||
48 | help | ||
49 | Enables the display of the minimum amount of free stack which each | ||
50 | task has ever had available in the sysrq-T and sysrq-P debug output. | ||
51 | |||
52 | This option will slow down process creation somewhat. | ||
53 | |||
45 | #config X86_REMOTE_DEBUG | 54 | #config X86_REMOTE_DEBUG |
46 | # bool "kgdb debugging stub" | 55 | # bool "kgdb debugging stub" |
47 | 56 | ||
diff --git a/include/asm-x86_64/thread_info.h b/include/asm-x86_64/thread_info.h index b5e88216fd80..2029b00351f3 100644 --- a/include/asm-x86_64/thread_info.h +++ b/include/asm-x86_64/thread_info.h | |||
@@ -73,8 +73,21 @@ static inline struct thread_info *stack_thread_info(void) | |||
73 | } | 73 | } |
74 | 74 | ||
75 | /* thread information allocation */ | 75 | /* thread information allocation */ |
76 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
77 | #define alloc_thread_info(tsk) \ | ||
78 | ({ \ | ||
79 | struct thread_info *ret; \ | ||
80 | \ | ||
81 | ret = ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)); \ | ||
82 | if (ret) \ | ||
83 | memset(ret, 0, THREAD_SIZE); \ | ||
84 | ret; \ | ||
85 | }) | ||
86 | #else | ||
76 | #define alloc_thread_info(tsk) \ | 87 | #define alloc_thread_info(tsk) \ |
77 | ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) | 88 | ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) |
89 | #endif | ||
90 | |||
78 | #define free_thread_info(ti) free_pages((unsigned long) (ti), THREAD_ORDER) | 91 | #define free_thread_info(ti) free_pages((unsigned long) (ti), THREAD_ORDER) |
79 | 92 | ||
80 | #else /* !__ASSEMBLY__ */ | 93 | #else /* !__ASSEMBLY__ */ |