x86: do tests before do_boot_cpu in i386
authorGlauber de Oliveira Costa <gcosta@redhat.com>
Wed, 19 Mar 2008 17:25:15 +0000 (14:25 -0300)
committerIngo Molnar <mingo@elte.hu>
Thu, 17 Apr 2008 15:41:00 +0000 (17:41 +0200)
Do tests before do_boot_cpu in native_cpu_up for i386.
Tests are a little bit broader than originally, and are the
same as x86_64. Test for smp_callin is not applicable right now
and is deferred.

Signed-off-by: Glauber Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/smpboot_32.c

index 8144aa3..147af81 100644 (file)
@@ -711,10 +711,6 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
        int     apicid, ret;
 
        apicid = per_cpu(x86_cpu_to_apicid, cpu);
-       if (apicid == BAD_APICID) {
-               ret = -ENODEV;
-               goto exit;
-       }
 
        info.complete = &done;
        info.apicid = apicid;
@@ -952,10 +948,22 @@ void __init native_smp_prepare_boot_cpu(void)
 
 int __cpuinit native_cpu_up(unsigned int cpu)
 {
+       int apicid = cpu_present_to_apicid(cpu);
        unsigned long flags;
-#ifdef CONFIG_HOTPLUG_CPU
        int ret = 0;
 
+       WARN_ON(irqs_disabled());
+
+       Dprintk("++++++++++++++++++++=_---CPU UP  %u\n", cpu);
+
+       if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid ||
+           !physid_isset(apicid, phys_cpu_present_map)) {
+               printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu);
+               return -EINVAL;
+       }
+
+#ifdef CONFIG_HOTPLUG_CPU
+
        /*
         * We do warm boot only on cpus that had booted earlier
         * Otherwise cold boot is all handled from smp_boot_cpus().