Re: [PATCH] bug in bigsmp CPU bringup

From: Andrew Morton
Date: Wed May 05 2004 - 21:05:34 EST



Len, Martin: please review?


From: "Pallipadi, Venkatesh" <venkatesh.pallipadi@xxxxxxxxx>

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).

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.


---

25-akpm/include/asm-i386/mach-bigsmp/mach_apic.h | 3 ++-
1 files changed, 2 insertions(+), 1 deletion(-)

diff -puN include/asm-i386/mach-bigsmp/mach_apic.h~bigsmp-cpu-bringup-fix include/asm-i386/mach-bigsmp/mach_apic.h
--- 25/include/asm-i386/mach-bigsmp/mach_apic.h~bigsmp-cpu-bringup-fix 2004-05-05 19:02:18.299905696 -0700
+++ 25-akpm/include/asm-i386/mach-bigsmp/mach_apic.h 2004-05-05 19:02:18.302905240 -0700
@@ -37,9 +37,10 @@ static inline unsigned long check_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)

_

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/