diff -urN linux-2.6.17/arch/i386/Kconfig.debug linux-2.6.17-16kstacks/arch/i386/Kconfig.debug --- linux-2.6.17/arch/i386/Kconfig.debug 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/arch/i386/Kconfig.debug 2006-06-20 07:03:06.000000000 -0400 @@ -71,6 +71,14 @@ on the VM subsystem for higher order allocations. This option will also use IRQ stacks to compensate for the reduced stackspace. +config 16KSTACKS + bool "Use 16Kb for kernel stacks instead of 8Kb" + depends on DEBUG_KERNEL + help + If you say Y here the kernel will use a 16Kb stacksize for the + kernel stack attached to each process/thread. This option + will also use IRQ stacks to compensate for the reduced stackspace. + config X86_FIND_SMP_CONFIG bool depends on X86_LOCAL_APIC || X86_VOYAGER diff -urN linux-2.6.17/arch/i386/defconfig linux-2.6.17-16kstacks/arch/i386/defconfig --- linux-2.6.17/arch/i386/defconfig 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/arch/i386/defconfig 2006-06-20 07:14:49.000000000 -0400 @@ -1518,12 +1518,14 @@ # # CONFIG_PRINTK_TIME is not set CONFIG_MAGIC_SYSRQ=y -# CONFIG_DEBUG_KERNEL is not set +CONFIG_DEBUG_KERNEL=y CONFIG_LOG_BUF_SHIFT=14 CONFIG_DEBUG_BUGVERBOSE=y CONFIG_EARLY_PRINTK=y CONFIG_X86_FIND_SMP_CONFIG=y CONFIG_X86_MPPARSE=y +# CONFIG_4KSTACKS is not set +CONFIG_16KSTACKS=y # # Security options diff -urN linux-2.6.17/arch/i386/kernel/irq.c linux-2.6.17-16kstacks/arch/i386/kernel/irq.c --- linux-2.6.17/arch/i386/kernel/irq.c 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/arch/i386/kernel/irq.c 2006-06-19 12:59:53.000000000 -0400 @@ -33,7 +33,7 @@ } #endif -#ifdef CONFIG_4KSTACKS +#if defined(CONFIG_4KSTACKS) || defined(CONFIG_16KSTACKS) /* * per-CPU IRQ handling contexts (thread information and stack) */ @@ -55,7 +55,7 @@ { /* high bits used in ret_from_ code */ int irq = regs->orig_eax & 0xff; -#ifdef CONFIG_4KSTACKS +#if defined(CONFIG_4KSTACKS) || defined(CONFIG_16KSTACKS) union irq_ctx *curctx, *irqctx; u32 *isp; #endif @@ -76,7 +76,7 @@ } #endif -#ifdef CONFIG_4KSTACKS +#if defined(CONFIG_4KSTACKS) || defined(CONFIG_16KSTACKS) curctx = (union irq_ctx *) current_thread_info(); irqctx = hardirq_ctx[smp_processor_id()]; @@ -112,7 +112,7 @@ return 1; } -#ifdef CONFIG_4KSTACKS +#if defined(CONFIG_4KSTACKS) || defined(CONFIG_16KSTACKS) /* * These should really be __section__(".bss.page_aligned") as well, but diff -urN linux-2.6.17/include/asm-i386/irq.h linux-2.6.17-16kstacks/include/asm-i386/irq.h --- linux-2.6.17/include/asm-i386/irq.h 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/include/asm-i386/irq.h 2006-06-19 12:59:53.000000000 -0400 @@ -25,7 +25,7 @@ # define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ #endif -#ifdef CONFIG_4KSTACKS +#if defined(CONFIG_4KSTACKS) || defined(CONFIG_16KSTACKS) extern void irq_ctx_init(int cpu); extern void irq_ctx_exit(int cpu); # define __ARCH_HAS_DO_SOFTIRQ diff -urN linux-2.6.17/include/asm-i386/module.h linux-2.6.17-16kstacks/include/asm-i386/module.h --- linux-2.6.17/include/asm-i386/module.h 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/include/asm-i386/module.h 2006-06-19 12:59:53.000000000 -0400 @@ -69,8 +69,12 @@ #ifdef CONFIG_4KSTACKS #define MODULE_STACKSIZE "4KSTACKS " #else +#ifdef CONFIG_16KSTACKS +#define MODULE_STACKSIZE "16KSTACKS " +#else #define MODULE_STACKSIZE "" #endif +#endif #define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_REGPARM MODULE_STACKSIZE diff -urN linux-2.6.17/include/asm-i386/thread_info.h linux-2.6.17-16kstacks/include/asm-i386/thread_info.h --- linux-2.6.17/include/asm-i386/thread_info.h 2006-06-17 21:49:35.000000000 -0400 +++ linux-2.6.17-16kstacks/include/asm-i386/thread_info.h 2006-06-19 12:59:53.000000000 -0400 @@ -56,8 +56,12 @@ #ifdef CONFIG_4KSTACKS #define THREAD_SIZE (4096) #else +#ifdef CONFIG_16KSTACKS +#define THREAD_SIZE (16384) +#else #define THREAD_SIZE (8192) #endif +#endif #define STACK_WARN (THREAD_SIZE/8) /*