diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-08-14 06:19:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-14 06:19:59 -0400 |
commit | 8d7ccaa545490cdffdfaff0842436a8dd85cf47b (patch) | |
tree | 8129b5907161bc6ae26deb3645ce1e280c5e1f51 /arch/x86/kernel/smpboot.c | |
parent | b2139aa0eec330c711c5a279db361e5ef1178e78 (diff) | |
parent | 30a2f3c60a84092c8084dfe788b710f8d0768cd4 (diff) |
Merge commit 'v2.6.27-rc3' into x86/prototypes
Conflicts:
include/asm-x86/dma-mapping.h
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index a9331a42f76f..6112c3632345 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -326,12 +326,16 @@ static void __cpuinit start_secondary(void *unused) | |||
326 | * for which cpus receive the IPI. Holding this | 326 | * for which cpus receive the IPI. Holding this |
327 | * lock helps us to not include this cpu in a currently in progress | 327 | * lock helps us to not include this cpu in a currently in progress |
328 | * smp_call_function(). | 328 | * smp_call_function(). |
329 | * | ||
330 | * We need to hold vector_lock so there the set of online cpus | ||
331 | * does not change while we are assigning vectors to cpus. Holding | ||
332 | * this lock ensures we don't half assign or remove an irq from a cpu. | ||
329 | */ | 333 | */ |
330 | ipi_call_lock_irq(); | 334 | ipi_call_lock_irq(); |
331 | #ifdef CONFIG_X86_IO_APIC | 335 | lock_vector_lock(); |
332 | setup_vector_irq(smp_processor_id()); | 336 | __setup_vector_irq(smp_processor_id()); |
333 | #endif | ||
334 | cpu_set(smp_processor_id(), cpu_online_map); | 337 | cpu_set(smp_processor_id(), cpu_online_map); |
338 | unlock_vector_lock(); | ||
335 | ipi_call_unlock_irq(); | 339 | ipi_call_unlock_irq(); |
336 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 340 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
337 | 341 | ||
@@ -438,7 +442,7 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
438 | cpu_set(cpu, cpu_sibling_setup_map); | 442 | cpu_set(cpu, cpu_sibling_setup_map); |
439 | 443 | ||
440 | if (smp_num_siblings > 1) { | 444 | if (smp_num_siblings > 1) { |
441 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | 445 | for_each_cpu_mask_nr(i, cpu_sibling_setup_map) { |
442 | if (c->phys_proc_id == cpu_data(i).phys_proc_id && | 446 | if (c->phys_proc_id == cpu_data(i).phys_proc_id && |
443 | c->cpu_core_id == cpu_data(i).cpu_core_id) { | 447 | c->cpu_core_id == cpu_data(i).cpu_core_id) { |
444 | cpu_set(i, per_cpu(cpu_sibling_map, cpu)); | 448 | cpu_set(i, per_cpu(cpu_sibling_map, cpu)); |
@@ -461,7 +465,7 @@ void __cpuinit set_cpu_sibling_map(int cpu) | |||
461 | return; | 465 | return; |
462 | } | 466 | } |
463 | 467 | ||
464 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | 468 | for_each_cpu_mask_nr(i, cpu_sibling_setup_map) { |
465 | if (per_cpu(cpu_llc_id, cpu) != BAD_APICID && | 469 | if (per_cpu(cpu_llc_id, cpu) != BAD_APICID && |
466 | per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) { | 470 | per_cpu(cpu_llc_id, cpu) == per_cpu(cpu_llc_id, i)) { |
467 | cpu_set(i, c->llc_shared_map); | 471 | cpu_set(i, c->llc_shared_map); |
@@ -990,7 +994,17 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
990 | flush_tlb_all(); | 994 | flush_tlb_all(); |
991 | low_mappings = 1; | 995 | low_mappings = 1; |
992 | 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 | ||
993 | err = do_boot_cpu(apicid, cpu); | 1006 | err = do_boot_cpu(apicid, cpu); |
1007 | #endif | ||
994 | 1008 | ||
995 | zap_low_mappings(); | 1009 | zap_low_mappings(); |
996 | low_mappings = 0; | 1010 | low_mappings = 0; |
@@ -1219,7 +1233,7 @@ static void remove_siblinginfo(int cpu) | |||
1219 | int sibling; | 1233 | int sibling; |
1220 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 1234 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
1221 | 1235 | ||
1222 | for_each_cpu_mask(sibling, per_cpu(cpu_core_map, cpu)) { | 1236 | for_each_cpu_mask_nr(sibling, per_cpu(cpu_core_map, cpu)) { |
1223 | cpu_clear(cpu, per_cpu(cpu_core_map, sibling)); | 1237 | cpu_clear(cpu, per_cpu(cpu_core_map, sibling)); |
1224 | /*/ | 1238 | /*/ |
1225 | * last thread sibling in this cpu core going down | 1239 | * last thread sibling in this cpu core going down |
@@ -1228,7 +1242,7 @@ static void remove_siblinginfo(int cpu) | |||
1228 | cpu_data(sibling).booted_cores--; | 1242 | cpu_data(sibling).booted_cores--; |
1229 | } | 1243 | } |
1230 | 1244 | ||
1231 | for_each_cpu_mask(sibling, per_cpu(cpu_sibling_map, cpu)) | 1245 | for_each_cpu_mask_nr(sibling, per_cpu(cpu_sibling_map, cpu)) |
1232 | cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling)); | 1246 | cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling)); |
1233 | cpus_clear(per_cpu(cpu_sibling_map, cpu)); | 1247 | cpus_clear(per_cpu(cpu_sibling_map, cpu)); |
1234 | cpus_clear(per_cpu(cpu_core_map, cpu)); | 1248 | cpus_clear(per_cpu(cpu_core_map, cpu)); |
@@ -1336,7 +1350,9 @@ int __cpu_disable(void) | |||
1336 | remove_siblinginfo(cpu); | 1350 | remove_siblinginfo(cpu); |
1337 | 1351 | ||
1338 | /* It's now safe to remove this processor from the online map */ | 1352 | /* It's now safe to remove this processor from the online map */ |
1353 | lock_vector_lock(); | ||
1339 | remove_cpu_from_maps(cpu); | 1354 | remove_cpu_from_maps(cpu); |
1355 | unlock_vector_lock(); | ||
1340 | fixup_irqs(cpu_online_map); | 1356 | fixup_irqs(cpu_online_map); |
1341 | return 0; | 1357 | return 0; |
1342 | } | 1358 | } |