diff options
author | Tejun Heo <tj@kernel.org> | 2010-01-04 19:17:33 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-01-04 19:17:33 -0500 |
commit | 32032df6c2f6c9c6b2ada2ce42322231824f70c2 (patch) | |
tree | b1ce838a37044bb38dfc128e2116ca35630e629a /arch/x86/kernel/smpboot.c | |
parent | 22b737f4c75197372d64afc6ed1bccd58c00e549 (diff) | |
parent | c5974b835a909ff15c3b7e6cf6789b5eb919f419 (diff) |
Merge branch 'master' into percpu
Conflicts:
arch/powerpc/platforms/pseries/hvCall.S
include/linux/percpu.h
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r-- | arch/x86/kernel/smpboot.c | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 565ebc65920e..678d0b8c26f3 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -671,6 +671,26 @@ static void __cpuinit do_fork_idle(struct work_struct *work) | |||
671 | complete(&c_idle->done); | 671 | complete(&c_idle->done); |
672 | } | 672 | } |
673 | 673 | ||
674 | /* reduce the number of lines printed when booting a large cpu count system */ | ||
675 | static void __cpuinit announce_cpu(int cpu, int apicid) | ||
676 | { | ||
677 | static int current_node = -1; | ||
678 | int node = cpu_to_node(cpu); | ||
679 | |||
680 | if (system_state == SYSTEM_BOOTING) { | ||
681 | if (node != current_node) { | ||
682 | if (current_node > (-1)) | ||
683 | pr_cont(" Ok.\n"); | ||
684 | current_node = node; | ||
685 | pr_info("Booting Node %3d, Processors ", node); | ||
686 | } | ||
687 | pr_cont(" #%d%s", cpu, cpu == (nr_cpu_ids - 1) ? " Ok.\n" : ""); | ||
688 | return; | ||
689 | } else | ||
690 | pr_info("Booting Node %d Processor %d APIC 0x%x\n", | ||
691 | node, cpu, apicid); | ||
692 | } | ||
693 | |||
674 | /* | 694 | /* |
675 | * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad | 695 | * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad |
676 | * (ie clustered apic addressing mode), this is a LOGICAL apic ID. | 696 | * (ie clustered apic addressing mode), this is a LOGICAL apic ID. |
@@ -687,7 +707,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu) | |||
687 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), | 707 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), |
688 | }; | 708 | }; |
689 | 709 | ||
690 | INIT_WORK(&c_idle.work, do_fork_idle); | 710 | INIT_WORK_ON_STACK(&c_idle.work, do_fork_idle); |
691 | 711 | ||
692 | alternatives_smp_switch(1); | 712 | alternatives_smp_switch(1); |
693 | 713 | ||
@@ -713,6 +733,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu) | |||
713 | 733 | ||
714 | if (IS_ERR(c_idle.idle)) { | 734 | if (IS_ERR(c_idle.idle)) { |
715 | printk("failed fork for CPU %d\n", cpu); | 735 | printk("failed fork for CPU %d\n", cpu); |
736 | destroy_work_on_stack(&c_idle.work); | ||
716 | return PTR_ERR(c_idle.idle); | 737 | return PTR_ERR(c_idle.idle); |
717 | } | 738 | } |
718 | 739 | ||
@@ -736,9 +757,8 @@ do_rest: | |||
736 | /* start_ip had better be page-aligned! */ | 757 | /* start_ip had better be page-aligned! */ |
737 | start_ip = setup_trampoline(); | 758 | start_ip = setup_trampoline(); |
738 | 759 | ||
739 | /* So we see what's up */ | 760 | /* So we see what's up */ |
740 | printk(KERN_INFO "Booting processor %d APIC 0x%x ip 0x%lx\n", | 761 | announce_cpu(cpu, apicid); |
741 | cpu, apicid, start_ip); | ||
742 | 762 | ||
743 | /* | 763 | /* |
744 | * This grunge runs the startup process for | 764 | * This grunge runs the startup process for |
@@ -787,21 +807,17 @@ do_rest: | |||
787 | udelay(100); | 807 | udelay(100); |
788 | } | 808 | } |
789 | 809 | ||
790 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) { | 810 | if (cpumask_test_cpu(cpu, cpu_callin_mask)) |
791 | /* number CPUs logically, starting from 1 (BSP is 0) */ | 811 | pr_debug("CPU%d: has booted.\n", cpu); |
792 | pr_debug("OK.\n"); | 812 | else { |
793 | printk(KERN_INFO "CPU%d: ", cpu); | ||
794 | print_cpu_info(&cpu_data(cpu)); | ||
795 | pr_debug("CPU has booted.\n"); | ||
796 | } else { | ||
797 | boot_error = 1; | 813 | boot_error = 1; |
798 | if (*((volatile unsigned char *)trampoline_base) | 814 | if (*((volatile unsigned char *)trampoline_base) |
799 | == 0xA5) | 815 | == 0xA5) |
800 | /* trampoline started but...? */ | 816 | /* trampoline started but...? */ |
801 | printk(KERN_ERR "Stuck ??\n"); | 817 | pr_err("CPU%d: Stuck ??\n", cpu); |
802 | else | 818 | else |
803 | /* trampoline code not run */ | 819 | /* trampoline code not run */ |
804 | printk(KERN_ERR "Not responding.\n"); | 820 | pr_err("CPU%d: Not responding.\n", cpu); |
805 | if (apic->inquire_remote_apic) | 821 | if (apic->inquire_remote_apic) |
806 | apic->inquire_remote_apic(apicid); | 822 | apic->inquire_remote_apic(apicid); |
807 | } | 823 | } |
@@ -831,6 +847,7 @@ do_rest: | |||
831 | smpboot_restore_warm_reset_vector(); | 847 | smpboot_restore_warm_reset_vector(); |
832 | } | 848 | } |
833 | 849 | ||
850 | destroy_work_on_stack(&c_idle.work); | ||
834 | return boot_error; | 851 | return boot_error; |
835 | } | 852 | } |
836 | 853 | ||
@@ -1250,16 +1267,7 @@ static void __ref remove_cpu_from_maps(int cpu) | |||
1250 | void cpu_disable_common(void) | 1267 | void cpu_disable_common(void) |
1251 | { | 1268 | { |
1252 | int cpu = smp_processor_id(); | 1269 | int cpu = smp_processor_id(); |
1253 | /* | ||
1254 | * HACK: | ||
1255 | * Allow any queued timer interrupts to get serviced | ||
1256 | * This is only a temporary solution until we cleanup | ||
1257 | * fixup_irqs as we do for IA64. | ||
1258 | */ | ||
1259 | local_irq_enable(); | ||
1260 | mdelay(1); | ||
1261 | 1270 | ||
1262 | local_irq_disable(); | ||
1263 | remove_siblinginfo(cpu); | 1271 | remove_siblinginfo(cpu); |
1264 | 1272 | ||
1265 | /* It's now safe to remove this processor from the online map */ | 1273 | /* It's now safe to remove this processor from the online map */ |
@@ -1300,14 +1308,16 @@ void native_cpu_die(unsigned int cpu) | |||
1300 | for (i = 0; i < 10; i++) { | 1308 | for (i = 0; i < 10; i++) { |
1301 | /* They ack this in play_dead by setting CPU_DEAD */ | 1309 | /* They ack this in play_dead by setting CPU_DEAD */ |
1302 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { | 1310 | if (per_cpu(cpu_state, cpu) == CPU_DEAD) { |
1303 | printk(KERN_INFO "CPU %d is now offline\n", cpu); | 1311 | if (system_state == SYSTEM_RUNNING) |
1312 | pr_info("CPU %u is now offline\n", cpu); | ||
1313 | |||
1304 | if (1 == num_online_cpus()) | 1314 | if (1 == num_online_cpus()) |
1305 | alternatives_smp_switch(0); | 1315 | alternatives_smp_switch(0); |
1306 | return; | 1316 | return; |
1307 | } | 1317 | } |
1308 | msleep(100); | 1318 | msleep(100); |
1309 | } | 1319 | } |
1310 | printk(KERN_ERR "CPU %u didn't die...\n", cpu); | 1320 | pr_err("CPU %u didn't die...\n", cpu); |
1311 | } | 1321 | } |
1312 | 1322 | ||
1313 | void play_dead_common(void) | 1323 | void play_dead_common(void) |