]> git.hungrycats.org Git - linux/commitdiff
[PATCH] changes do_boot_cpu to return an error code
authorMartin J. Bligh <mbligh@aracnet.com>
Tue, 7 Jan 2003 05:47:57 +0000 (21:47 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Tue, 7 Jan 2003 05:47:57 +0000 (21:47 -0800)
Patch from James Cleverdon

Changes do_boot_cpu to return an error code, instead of trying to
work it out later by magic and voodoo. Removes the other usage
of apicid->cpu which is hard to maintain cleanly.

arch/i386/kernel/smpboot.c

index 26b28b7f5391f7c4f60e7821dda9157af4d3b86e..98b903942e20a3a8c2866b3c05e5aa6882282de6 100644 (file)
@@ -810,14 +810,15 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
 
 extern unsigned long cpu_initialized;
 
-static void __init do_boot_cpu (int apicid) 
+static int __init do_boot_cpu(int apicid)
 /*
  * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
  * (ie clustered apic addressing mode), this is a LOGICAL apic ID.
+ * Returns zero if CPU booted OK, else error code from wakeup_secondary_cpu.
  */
 {
        struct task_struct *idle;
-       unsigned long boot_error = 0;
+       unsigned long boot_error;
        int timeout, cpu;
        unsigned long start_eip;
        unsigned short nmi_high, nmi_low;
@@ -882,15 +883,10 @@ static void __init do_boot_cpu (int apicid)
                apic_read(APIC_ESR);
        }
 
-       /*
-        * Status is now clean
-        */
-       boot_error = 0;
-
        /*
         * Starting actual IPI sequence...
         */
-       wakeup_secondary_cpu(apicid, start_eip);
+       boot_error = wakeup_secondary_cpu(apicid, start_eip);
 
        if (!boot_error) {
                /*
@@ -946,6 +942,7 @@ static void __init do_boot_cpu (int apicid)
                *((volatile unsigned short *) TRAMPOLINE_HIGH) = nmi_high;
                *((volatile unsigned short *) TRAMPOLINE_LOW) = nmi_low;
        }
+       return boot_error;
 }
 
 cycles_t cacheflush_time;
@@ -1117,13 +1114,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
                if (max_cpus <= cpucount+1)
                        continue;
 
-               do_boot_cpu(apicid);
-
-               /*
-                * Make sure we unmap all failed CPUs
-                */
-               if ((boot_apicid_to_cpu(apicid) == -1) &&
-                               (phys_cpu_present_map & (1 << bit)))
+               if (do_boot_cpu(apicid))
                        printk("CPU #%d not responding - cannot use it.\n",
                                                                apicid);
        }