From: William Lee Irwin III To handle sparse physical APIC ID's properly the phys_cpu_present_map must be scanned beyond bit NR_CPUS while ensuring no more than NR_CPUS are woken in order not to attempt to wake non-addressible cpus. The following patch adds that logic to smp_boot_cpus() and corrects the failure to wake secondaries reported by dhowells, with successful wakeup, runtime, reboot, and halting reported after it was applied. arch/i386/kernel/smpboot.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff -puN arch/i386/kernel/smpboot.c~handle-sparse-physical-apid-ids arch/i386/kernel/smpboot.c --- 25/arch/i386/kernel/smpboot.c~handle-sparse-physical-apid-ids 2003-05-17 14:09:57.000000000 -0700 +++ 25-akpm/arch/i386/kernel/smpboot.c 2003-05-17 14:09:57.000000000 -0700 @@ -935,7 +935,7 @@ int cpu_sibling_map[NR_CPUS] __cacheline static void __init smp_boot_cpus(unsigned int max_cpus) { - int apicid, cpu, bit; + int apicid, cpu, bit, kicked; /* * Setup boot CPU information @@ -1018,7 +1018,8 @@ static void __init smp_boot_cpus(unsigne */ Dprintk("CPU present map: %lx\n", phys_cpu_present_map); - for (bit = 0; bit < NR_CPUS; bit++) { + kicked = 1; + for (bit = 0; kicked < NR_CPUS && bit < BITS_PER_LONG; bit++) { apicid = cpu_present_to_apicid(bit); /* * Don't even attempt to start the boot CPU! @@ -1034,6 +1035,8 @@ static void __init smp_boot_cpus(unsigne if (do_boot_cpu(apicid)) printk("CPU #%d not responding - cannot use it.\n", apicid); + else + ++kicked; } /* _