diff options
| -rw-r--r-- | Documentation/x86/x86_64/kernel-stacks | 6 | ||||
| -rw-r--r-- | arch/x86/Kconfig.debug | 10 | ||||
| -rw-r--r-- | arch/x86/include/asm/irq.h | 12 | ||||
| -rw-r--r-- | arch/x86/include/asm/module.h | 7 | ||||
| -rw-r--r-- | arch/x86/include/asm/page_32_types.h | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/irq_32.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/vmlinux.lds.S | 2 | ||||
| -rw-r--r-- | include/linux/percpu-defs.h | 12 |
8 files changed, 25 insertions, 40 deletions
diff --git a/Documentation/x86/x86_64/kernel-stacks b/Documentation/x86/x86_64/kernel-stacks index 5ad65d51fb95..a01eec5d1d0b 100644 --- a/Documentation/x86/x86_64/kernel-stacks +++ b/Documentation/x86/x86_64/kernel-stacks | |||
| @@ -18,9 +18,9 @@ specialized stacks contain no useful data. The main CPU stacks are: | |||
| 18 | Used for external hardware interrupts. If this is the first external | 18 | Used for external hardware interrupts. If this is the first external |
| 19 | hardware interrupt (i.e. not a nested hardware interrupt) then the | 19 | hardware interrupt (i.e. not a nested hardware interrupt) then the |
| 20 | kernel switches from the current task to the interrupt stack. Like | 20 | kernel switches from the current task to the interrupt stack. Like |
| 21 | the split thread and interrupt stacks on i386 (with CONFIG_4KSTACKS), | 21 | the split thread and interrupt stacks on i386, this gives more room |
| 22 | this gives more room for kernel interrupt processing without having | 22 | for kernel interrupt processing without having to increase the size |
| 23 | to increase the size of every per thread stack. | 23 | of every per thread stack. |
| 24 | 24 | ||
| 25 | The interrupt stack is also used when processing a softirq. | 25 | The interrupt stack is also used when processing a softirq. |
| 26 | 26 | ||
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug index e5bb96b10f1a..b59ee765414e 100644 --- a/arch/x86/Kconfig.debug +++ b/arch/x86/Kconfig.debug | |||
| @@ -125,16 +125,6 @@ config DEBUG_NX_TEST | |||
| 125 | and the software setup of this feature. | 125 | and the software setup of this feature. |
| 126 | If in doubt, say "N" | 126 | If in doubt, say "N" |
| 127 | 127 | ||
| 128 | config 4KSTACKS | ||
| 129 | bool "Use 4Kb for kernel stacks instead of 8Kb" | ||
| 130 | depends on X86_32 | ||
| 131 | ---help--- | ||
| 132 | If you say Y here the kernel will use a 4Kb stacksize for the | ||
| 133 | kernel stack attached to each process/thread. This facilitates | ||
| 134 | running more threads on a system and also reduces the pressure | ||
| 135 | on the VM subsystem for higher order allocations. This option | ||
| 136 | will also use IRQ stacks to compensate for the reduced stackspace. | ||
| 137 | |||
| 138 | config DOUBLEFAULT | 128 | config DOUBLEFAULT |
| 139 | default y | 129 | default y |
| 140 | bool "Enable doublefault exception handler" if EMBEDDED | 130 | bool "Enable doublefault exception handler" if EMBEDDED |
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 5458380b6ef8..0bf5b0083650 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
| @@ -19,18 +19,16 @@ static inline int irq_canonicalize(int irq) | |||
| 19 | # define ARCH_HAS_NMI_WATCHDOG | 19 | # define ARCH_HAS_NMI_WATCHDOG |
| 20 | #endif | 20 | #endif |
| 21 | 21 | ||
| 22 | #ifdef CONFIG_4KSTACKS | 22 | #ifdef CONFIG_X86_32 |
| 23 | extern void irq_ctx_init(int cpu); | 23 | extern void irq_ctx_init(int cpu); |
| 24 | extern void irq_ctx_exit(int cpu); | 24 | extern void irq_ctx_exit(int cpu); |
| 25 | # define __ARCH_HAS_DO_SOFTIRQ | ||
| 26 | #else | 25 | #else |
| 27 | # define irq_ctx_init(cpu) do { } while (0) | 26 | # define irq_ctx_init(cpu) do { } while (0) |
| 28 | # define irq_ctx_exit(cpu) do { } while (0) | 27 | # define irq_ctx_exit(cpu) do { } while (0) |
| 29 | # ifdef CONFIG_X86_64 | ||
| 30 | # define __ARCH_HAS_DO_SOFTIRQ | ||
| 31 | # endif | ||
| 32 | #endif | 28 | #endif |
| 33 | 29 | ||
| 30 | #define __ARCH_HAS_DO_SOFTIRQ | ||
| 31 | |||
| 34 | #ifdef CONFIG_HOTPLUG_CPU | 32 | #ifdef CONFIG_HOTPLUG_CPU |
| 35 | #include <linux/cpumask.h> | 33 | #include <linux/cpumask.h> |
| 36 | extern void fixup_irqs(void); | 34 | extern void fixup_irqs(void); |
diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h index 3e2ce58a31a3..67763c5d8b4e 100644 --- a/arch/x86/include/asm/module.h +++ b/arch/x86/include/asm/module.h | |||
| @@ -60,12 +60,7 @@ | |||
| 60 | #endif | 60 | #endif |
| 61 | 61 | ||
| 62 | #ifdef CONFIG_X86_32 | 62 | #ifdef CONFIG_X86_32 |
| 63 | # ifdef CONFIG_4KSTACKS | 63 | # define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY |
| 64 | # define MODULE_STACKSIZE "4KSTACKS " | ||
| 65 | # else | ||
| 66 | # define MODULE_STACKSIZE "" | ||
| 67 | # endif | ||
| 68 | # define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE | ||
| 69 | #endif | 64 | #endif |
| 70 | 65 | ||
| 71 | #endif /* _ASM_X86_MODULE_H */ | 66 | #endif /* _ASM_X86_MODULE_H */ |
diff --git a/arch/x86/include/asm/page_32_types.h b/arch/x86/include/asm/page_32_types.h index 6f1b7331313f..ade619ff9e2a 100644 --- a/arch/x86/include/asm/page_32_types.h +++ b/arch/x86/include/asm/page_32_types.h | |||
| @@ -15,11 +15,7 @@ | |||
| 15 | */ | 15 | */ |
| 16 | #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) | 16 | #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_4KSTACKS | ||
| 19 | #define THREAD_ORDER 0 | ||
| 20 | #else | ||
| 21 | #define THREAD_ORDER 1 | 18 | #define THREAD_ORDER 1 |
| 22 | #endif | ||
| 23 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) | 19 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) |
| 24 | 20 | ||
| 25 | #define STACKFAULT_STACK 0 | 21 | #define STACKFAULT_STACK 0 |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 10709f29d166..50fbbe60e507 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
| @@ -49,20 +49,19 @@ static inline int check_stack_overflow(void) { return 0; } | |||
| 49 | static inline void print_stack_overflow(void) { } | 49 | static inline void print_stack_overflow(void) { } |
| 50 | #endif | 50 | #endif |
| 51 | 51 | ||
| 52 | #ifdef CONFIG_4KSTACKS | ||
| 53 | /* | 52 | /* |
| 54 | * per-CPU IRQ handling contexts (thread information and stack) | 53 | * per-CPU IRQ handling contexts (thread information and stack) |
| 55 | */ | 54 | */ |
| 56 | union irq_ctx { | 55 | union irq_ctx { |
| 57 | struct thread_info tinfo; | 56 | struct thread_info tinfo; |
| 58 | u32 stack[THREAD_SIZE/sizeof(u32)]; | 57 | u32 stack[THREAD_SIZE/sizeof(u32)]; |
| 59 | } __attribute__((aligned(PAGE_SIZE))); | 58 | } __attribute__((aligned(THREAD_SIZE))); |
| 60 | 59 | ||
| 61 | static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx); | 60 | static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx); |
| 62 | static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx); | 61 | static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx); |
| 63 | 62 | ||
| 64 | static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, hardirq_stack); | 63 | static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, hardirq_stack, THREAD_SIZE); |
| 65 | static DEFINE_PER_CPU_PAGE_ALIGNED(union irq_ctx, softirq_stack); | 64 | static DEFINE_PER_CPU_MULTIPAGE_ALIGNED(union irq_ctx, softirq_stack, THREAD_SIZE); |
| 66 | 65 | ||
| 67 | static void call_on_stack(void *func, void *stack) | 66 | static void call_on_stack(void *func, void *stack) |
| 68 | { | 67 | { |
| @@ -187,11 +186,6 @@ asmlinkage void do_softirq(void) | |||
| 187 | local_irq_restore(flags); | 186 | local_irq_restore(flags); |
| 188 | } | 187 | } |
| 189 | 188 | ||
| 190 | #else | ||
| 191 | static inline int | ||
| 192 | execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; } | ||
| 193 | #endif | ||
| 194 | |||
| 195 | bool handle_irq(unsigned irq, struct pt_regs *regs) | 189 | bool handle_irq(unsigned irq, struct pt_regs *regs) |
| 196 | { | 190 | { |
| 197 | struct irq_desc *desc; | 191 | struct irq_desc *desc; |
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index 38e2b67807e1..e03530aebfd0 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
| @@ -301,7 +301,7 @@ SECTIONS | |||
| 301 | } | 301 | } |
| 302 | 302 | ||
| 303 | #if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) | 303 | #if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP) |
| 304 | PERCPU(PAGE_SIZE) | 304 | PERCPU(THREAD_SIZE) |
| 305 | #endif | 305 | #endif |
| 306 | 306 | ||
| 307 | . = ALIGN(PAGE_SIZE); | 307 | . = ALIGN(PAGE_SIZE); |
diff --git a/include/linux/percpu-defs.h b/include/linux/percpu-defs.h index 27ef6b190ea6..018db9a62ffe 100644 --- a/include/linux/percpu-defs.h +++ b/include/linux/percpu-defs.h | |||
| @@ -148,6 +148,18 @@ | |||
| 148 | DEFINE_PER_CPU_SECTION(type, name, "..readmostly") | 148 | DEFINE_PER_CPU_SECTION(type, name, "..readmostly") |
| 149 | 149 | ||
| 150 | /* | 150 | /* |
| 151 | * Declaration/definition used for large per-CPU variables that must be | ||
| 152 | * aligned to something larger than the pagesize. | ||
| 153 | */ | ||
| 154 | #define DECLARE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \ | ||
| 155 | DECLARE_PER_CPU_SECTION(type, name, "..page_aligned") \ | ||
| 156 | __aligned(size) | ||
| 157 | |||
| 158 | #define DEFINE_PER_CPU_MULTIPAGE_ALIGNED(type, name, size) \ | ||
| 159 | DEFINE_PER_CPU_SECTION(type, name, "..page_aligned") \ | ||
| 160 | __aligned(size) | ||
| 161 | |||
| 162 | /* | ||
| 151 | * Intermodule exports for per-CPU variables. sparse forgets about | 163 | * Intermodule exports for per-CPU variables. sparse forgets about |
| 152 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to | 164 | * address space across EXPORT_SYMBOL(), change EXPORT_SYMBOL() to |
| 153 | * noop if __CHECKER__. | 165 | * noop if __CHECKER__. |
