aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/smpboot.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
-rw-r--r--arch/x86/kernel/smpboot.c104
1 files changed, 32 insertions, 72 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 34826934d4a7..bc52fac39dd3 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -111,7 +111,6 @@ atomic_t init_deasserted;
111static void smp_callin(void) 111static void smp_callin(void)
112{ 112{
113 int cpuid, phys_id; 113 int cpuid, phys_id;
114 unsigned long timeout;
115 114
116 /* 115 /*
117 * If waken up by an INIT in an 82489DX configuration 116 * If waken up by an INIT in an 82489DX configuration
@@ -130,37 +129,6 @@ static void smp_callin(void)
130 * (This works even if the APIC is not enabled.) 129 * (This works even if the APIC is not enabled.)
131 */ 130 */
132 phys_id = read_apic_id(); 131 phys_id = read_apic_id();
133 if (cpumask_test_cpu(cpuid, cpu_callin_mask)) {
134 panic("%s: phys CPU#%d, CPU#%d already present??\n", __func__,
135 phys_id, cpuid);
136 }
137 pr_debug("CPU#%d (phys ID: %d) waiting for CALLOUT\n", cpuid, phys_id);
138
139 /*
140 * STARTUP IPIs are fragile beasts as they might sometimes
141 * trigger some glue motherboard logic. Complete APIC bus
142 * silence for 1 second, this overestimates the time the
143 * boot CPU is spending to send the up to 2 STARTUP IPIs
144 * by a factor of two. This should be enough.
145 */
146
147 /*
148 * Waiting 2s total for startup (udelay is not yet working)
149 */
150 timeout = jiffies + 2*HZ;
151 while (time_before(jiffies, timeout)) {
152 /*
153 * Has the boot CPU finished it's STARTUP sequence?
154 */
155 if (cpumask_test_cpu(cpuid, cpu_callout_mask))
156 break;
157 cpu_relax();
158 }
159
160 if (!time_before(jiffies, timeout)) {
161 panic("%s: CPU%d started up but did not get a callout!\n",
162 __func__, cpuid);
163 }
164 132
165 /* 133 /*
166 * the boot CPU has finished the init stage and is spinning 134 * the boot CPU has finished the init stage and is spinning
@@ -750,8 +718,8 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
750 unsigned long start_ip = real_mode_header->trampoline_start; 718 unsigned long start_ip = real_mode_header->trampoline_start;
751 719
752 unsigned long boot_error = 0; 720 unsigned long boot_error = 0;
753 int timeout;
754 int cpu0_nmi_registered = 0; 721 int cpu0_nmi_registered = 0;
722 unsigned long timeout;
755 723
756 /* Just in case we booted with a single CPU. */ 724 /* Just in case we booted with a single CPU. */
757 alternatives_enable_smp(); 725 alternatives_enable_smp();
@@ -799,6 +767,15 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
799 } 767 }
800 768
801 /* 769 /*
770 * AP might wait on cpu_callout_mask in cpu_init() with
771 * cpu_initialized_mask set if previous attempt to online
772 * it timed-out. Clear cpu_initialized_mask so that after
773 * INIT/SIPI it could start with a clean state.
774 */
775 cpumask_clear_cpu(cpu, cpu_initialized_mask);
776 smp_mb();
777
778 /*
802 * Wake up a CPU in difference cases: 779 * Wake up a CPU in difference cases:
803 * - Use the method in the APIC driver if it's defined 780 * - Use the method in the APIC driver if it's defined
804 * Otherwise, 781 * Otherwise,
@@ -810,58 +787,41 @@ static int do_boot_cpu(int apicid, int cpu, struct task_struct *idle)
810 boot_error = wakeup_cpu_via_init_nmi(cpu, start_ip, apicid, 787 boot_error = wakeup_cpu_via_init_nmi(cpu, start_ip, apicid,
811 &cpu0_nmi_registered); 788 &cpu0_nmi_registered);
812 789
790
813 if (!boot_error) { 791 if (!boot_error) {
814 /* 792 /*
815 * allow APs to start initializing. 793 * Wait 10s total for a response from AP
816 */ 794 */
817 pr_debug("Before Callout %d\n", cpu); 795 boot_error = -1;
818 cpumask_set_cpu(cpu, cpu_callout_mask); 796 timeout = jiffies + 10*HZ;
819 pr_debug("After Callout %d\n", cpu); 797 while (time_before(jiffies, timeout)) {
798 if (cpumask_test_cpu(cpu, cpu_initialized_mask)) {
799 /*
800 * Tell AP to proceed with initialization
801 */
802 cpumask_set_cpu(cpu, cpu_callout_mask);
803 boot_error = 0;
804 break;
805 }
806 udelay(100);
807 schedule();
808 }
809 }
820 810
811 if (!boot_error) {
821 /* 812 /*
822 * Wait 5s total for a response 813 * Wait till AP completes initial initialization
823 */ 814 */
824 for (timeout = 0; timeout < 50000; timeout++) { 815 while (!cpumask_test_cpu(cpu, cpu_callin_mask)) {
825 if (cpumask_test_cpu(cpu, cpu_callin_mask))
826 break; /* It has booted */
827 udelay(100);
828 /* 816 /*
829 * Allow other tasks to run while we wait for the 817 * Allow other tasks to run while we wait for the
830 * AP to come online. This also gives a chance 818 * AP to come online. This also gives a chance
831 * for the MTRR work(triggered by the AP coming online) 819 * for the MTRR work(triggered by the AP coming online)
832 * to be completed in the stop machine context. 820 * to be completed in the stop machine context.
833 */ 821 */
822 udelay(100);
834 schedule(); 823 schedule();
835 } 824 }
836
837 if (cpumask_test_cpu(cpu, cpu_callin_mask)) {
838 print_cpu_msr(&cpu_data(cpu));
839 pr_debug("CPU%d: has booted.\n", cpu);
840 } else {
841 boot_error = 1;
842 if (*trampoline_status == 0xA5A5A5A5)
843 /* trampoline started but...? */
844 pr_err("CPU%d: Stuck ??\n", cpu);
845 else
846 /* trampoline code not run */
847 pr_err("CPU%d: Not responding\n", cpu);
848 if (apic->inquire_remote_apic)
849 apic->inquire_remote_apic(apicid);
850 }
851 }
852
853 if (boot_error) {
854 /* Try to put things back the way they were before ... */
855 numa_remove_cpu(cpu); /* was set by numa_add_cpu */
856
857 /* was set by do_boot_cpu() */
858 cpumask_clear_cpu(cpu, cpu_callout_mask);
859
860 /* was set by cpu_init() */
861 cpumask_clear_cpu(cpu, cpu_initialized_mask);
862
863 set_cpu_present(cpu, false);
864 per_cpu(x86_cpu_to_apicid, cpu) = BAD_APICID;
865 } 825 }
866 826
867 /* mark "stuck" area as not stuck */ 827 /* mark "stuck" area as not stuck */
@@ -921,7 +881,7 @@ int native_cpu_up(unsigned int cpu, struct task_struct *tidle)
921 881
922 err = do_boot_cpu(apicid, cpu, tidle); 882 err = do_boot_cpu(apicid, cpu, tidle);
923 if (err) { 883 if (err) {
924 pr_debug("do_boot_cpu failed %d\n", err); 884 pr_err("do_boot_cpu failed(%d) to wakeup CPU#%u\n", err, cpu);
925 return -EIO; 885 return -EIO;
926 } 886 }
927 887