diff options
author | Yinghai Lu <yhlu.kernel@gmail.com> | 2008-08-14 05:16:30 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-14 05:35:53 -0400 |
commit | a58f03b07539f6575adaa011712fa139c9343742 (patch) | |
tree | 657237a6551ddc58d35fad8f0f998d7dcb090b44 /arch/x86/kernel/smpboot.c | |
parent | 858f774733b72609acb28104475f131abb912c08 (diff) |
x86: check bigsmp in smp_sanity_check instead of cpu_up
clear bits for cpu nr > 8.
This allows us to boot the full range of possible CPUs that the
supported APIC model will allow. Previously we'd hang or boot up
with less than 8 CPUs.
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Tested-by: Jeff Chua <jeff.chua.linux@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index e25287e4a85f..a8fb8a980fae 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -994,17 +994,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
994 | flush_tlb_all(); | 994 | flush_tlb_all(); |
995 | low_mappings = 1; | 995 | low_mappings = 1; |
996 | 996 | ||
997 | #ifdef CONFIG_X86_PC | ||
998 | if (def_to_bigsmp && apicid > 8) { | ||
999 | printk(KERN_WARNING | ||
1000 | "More than 8 CPUs detected - skipping them.\n" | ||
1001 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
1002 | err = -1; | ||
1003 | } else | ||
1004 | err = do_boot_cpu(apicid, cpu); | ||
1005 | #else | ||
1006 | err = do_boot_cpu(apicid, cpu); | 997 | err = do_boot_cpu(apicid, cpu); |
1007 | #endif | ||
1008 | 998 | ||
1009 | zap_low_mappings(); | 999 | zap_low_mappings(); |
1010 | low_mappings = 0; | 1000 | low_mappings = 0; |
@@ -1058,6 +1048,34 @@ static __init void disable_smp(void) | |||
1058 | static int __init smp_sanity_check(unsigned max_cpus) | 1048 | static int __init smp_sanity_check(unsigned max_cpus) |
1059 | { | 1049 | { |
1060 | preempt_disable(); | 1050 | preempt_disable(); |
1051 | |||
1052 | #if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) | ||
1053 | if (def_to_bigsmp && nr_cpu_ids > 8) { | ||
1054 | unsigned int cpu; | ||
1055 | unsigned nr; | ||
1056 | |||
1057 | printk(KERN_WARNING | ||
1058 | "More than 8 CPUs detected - skipping them.\n" | ||
1059 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
1060 | |||
1061 | nr = 0; | ||
1062 | for_each_present_cpu(cpu) { | ||
1063 | if (nr >= 8) | ||
1064 | cpu_clear(cpu, cpu_present_map); | ||
1065 | nr++; | ||
1066 | } | ||
1067 | |||
1068 | nr = 0; | ||
1069 | for_each_possible_cpu(cpu) { | ||
1070 | if (nr >= 8) | ||
1071 | cpu_clear(cpu, cpu_possible_map); | ||
1072 | nr++; | ||
1073 | } | ||
1074 | |||
1075 | nr_cpu_ids = 8; | ||
1076 | } | ||
1077 | #endif | ||
1078 | |||
1061 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { | 1079 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { |
1062 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" | 1080 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" |
1063 | "by the BIOS.\n", hard_smp_processor_id()); | 1081 | "by the BIOS.\n", hard_smp_processor_id()); |