]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] bug in bigsmp CPU bringup
authorVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Thu, 6 May 2004 00:36:05 +0000 (17:36 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 6 May 2004 00:36:05 +0000 (17:36 -0700)
There is an bug in bigsmp sub-architecture, due to which it will not
enable all the CPUs when the BIOS-APICIDs are not 0 to n-1 (where n is
total number of CPUs). Particularly, only 2 CPU comes up on a system
that has 4 CPUs with BIOS APICID as (0, 1, 6, 7).=20

The bug is root caused to check_apicid_present(bit) call in smpboot.c,
when bigsmp is expecting apicid in place of bit.
check_apicid_present(bit) in bigsmp subarchitecture checks the bit with
phys_id_present_map (which is actually map representing all apicids and
not bit).

One solution is to change check_apicid_present(bit) to
check_apicid_present(apicid), in smp_boot_cpus().  But, it can affect
all the other subarchitectures in various subtle ways.  So, here is a
simple alternate fix (Thanks to Martin Bligh), which solves the above
problem.

[ Confirmation from Martin:

     Looks fine, it's exactly the same fix we use for Summit.  Since
     we're using the other method instead of the bitmap, this check
     isn't needed, so we can just bypass it.  This way also has the
     great advantage of being isolated to the bigsmp subarch, so it only
     needs testing there ;-)
 ]

include/asm-i386/mach-bigsmp/mach_apic.h

index 12980e389c65037dc2d922fa6ba0a0263d1c8d2c..4f887d605e069323ff45b78bd654dcf23474d6c4 100644 (file)
@@ -37,9 +37,10 @@ static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid)
        return 0;
 }
 
+/* we don't use the phys_cpu_present_map to indicate apicid presence */
 static inline unsigned long check_apicid_present(int bit) 
 {
-       return physid_isset(bit, phys_cpu_present_map);
+       return 1;
 }
 
 #define apicid_cluster(apicid) (apicid & 0xF0)