diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-25 17:15:38 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-25 17:15:38 -0400 |
| commit | d25e26b61d59370eee8b7f2634641eb0fa76e952 (patch) | |
| tree | 51356ee7102416d8f61a55b8447e7f59279347f5 | |
| parent | 426e1eafdbd1d1349c852a2b90c7f20879d52ed2 (diff) | |
[x86] Clean up MAXSMP Kconfig, and limit NR_CPUS to 512
This fixes a regression that was indirectly caused by commit
1184dc2ffe2c8fb9afb766d870850f2c3165ef25 ("x86: modify Kconfig to allow
up to 4096 cpus").
Allowing 4k CPU's is not practical at this time, because we still have a
number of places that have several 'cpumask_t's on the stack, and a
4k-bit cpumask is 512 bytes of stack-space for each such variable. This
literally caused functions like 'smp_call_function_mask' to have a 2.5kB
stack frame, and several functions to have 2kB stackframes.
With an 8kB stack total, smashing the stack was simply much too likely.
At least bugzilla entry
http://bugzilla.kernel.org/show_bug.cgi?id=11342
was due to this.
The earlier commit to not inline load_module() into sys_init_module()
fixed the particular symptoms of this that Alan Brunelle saw in that
bugzilla entry, but the huge stack waste by cpumask_t's was the more
direct cause.
Some day we'll have allocation helpers that allocate large CPU masks
dynamically, but in the meantime we simply cannot allow cpumasks this
large.
Cc: Alan D. Brunelle <Alan.Brunelle@hp.com>
Cc: Mike Travis <travis@sgi.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/x86/Kconfig | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 68d91c8233f4..ed92864d1325 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -577,35 +577,29 @@ config SWIOTLB | |||
| 577 | 577 | ||
| 578 | config IOMMU_HELPER | 578 | config IOMMU_HELPER |
| 579 | def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU) | 579 | def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU) |
| 580 | |||
| 580 | config MAXSMP | 581 | config MAXSMP |
| 581 | bool "Configure Maximum number of SMP Processors and NUMA Nodes" | 582 | bool "Configure Maximum number of SMP Processors and NUMA Nodes" |
| 582 | depends on X86_64 && SMP | 583 | depends on X86_64 && SMP && BROKEN |
| 583 | default n | 584 | default n |
| 584 | help | 585 | help |
| 585 | Configure maximum number of CPUS and NUMA Nodes for this architecture. | 586 | Configure maximum number of CPUS and NUMA Nodes for this architecture. |
| 586 | If unsure, say N. | 587 | If unsure, say N. |
| 587 | 588 | ||
| 588 | if MAXSMP | ||
| 589 | config NR_CPUS | ||
| 590 | int | ||
| 591 | default "4096" | ||
| 592 | endif | ||
| 593 | |||
| 594 | if !MAXSMP | ||
| 595 | config NR_CPUS | 589 | config NR_CPUS |
| 596 | int "Maximum number of CPUs (2-4096)" | 590 | int "Maximum number of CPUs (2-512)" if !MAXSMP |
| 597 | range 2 4096 | 591 | range 2 512 |
| 598 | depends on SMP | 592 | depends on SMP |
| 593 | default "4096" if MAXSMP | ||
| 599 | default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000 | 594 | default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000 |
| 600 | default "8" | 595 | default "8" |
| 601 | help | 596 | help |
| 602 | This allows you to specify the maximum number of CPUs which this | 597 | This allows you to specify the maximum number of CPUs which this |
| 603 | kernel will support. The maximum supported value is 4096 and the | 598 | kernel will support. The maximum supported value is 512 and the |
| 604 | minimum value which makes sense is 2. | 599 | minimum value which makes sense is 2. |
| 605 | 600 | ||
| 606 | This is purely to save memory - each supported CPU adds | 601 | This is purely to save memory - each supported CPU adds |
| 607 | approximately eight kilobytes to the kernel image. | 602 | approximately eight kilobytes to the kernel image. |
| 608 | endif | ||
| 609 | 603 | ||
| 610 | config SCHED_SMT | 604 | config SCHED_SMT |
| 611 | bool "SMT (Hyperthreading) scheduler support" | 605 | bool "SMT (Hyperthreading) scheduler support" |
| @@ -996,17 +990,10 @@ config NUMA_EMU | |||
| 996 | into virtual nodes when booted with "numa=fake=N", where N is the | 990 | into virtual nodes when booted with "numa=fake=N", where N is the |
| 997 | number of nodes. This is only useful for debugging. | 991 | number of nodes. This is only useful for debugging. |
| 998 | 992 | ||
| 999 | if MAXSMP | ||
| 1000 | |||
| 1001 | config NODES_SHIFT | 993 | config NODES_SHIFT |
| 1002 | int | 994 | int "Maximum NUMA Nodes (as a power of 2)" if !MAXSMP |
| 1003 | default "9" | ||
| 1004 | endif | ||
| 1005 | |||
| 1006 | if !MAXSMP | ||
| 1007 | config NODES_SHIFT | ||
| 1008 | int "Maximum NUMA Nodes (as a power of 2)" | ||
| 1009 | range 1 9 if X86_64 | 995 | range 1 9 if X86_64 |
| 996 | default "9" if MAXSMP | ||
| 1010 | default "6" if X86_64 | 997 | default "6" if X86_64 |
| 1011 | default "4" if X86_NUMAQ | 998 | default "4" if X86_NUMAQ |
| 1012 | default "3" | 999 | default "3" |
| @@ -1014,7 +1001,6 @@ config NODES_SHIFT | |||
| 1014 | help | 1001 | help |
| 1015 | Specify the maximum number of NUMA Nodes available on the target | 1002 | Specify the maximum number of NUMA Nodes available on the target |
| 1016 | system. Increases memory reserved to accomodate various tables. | 1003 | system. Increases memory reserved to accomodate various tables. |
| 1017 | endif | ||
| 1018 | 1004 | ||
| 1019 | config HAVE_ARCH_BOOTMEM_NODE | 1005 | config HAVE_ARCH_BOOTMEM_NODE |
| 1020 | def_bool y | 1006 | def_bool y |
