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 ;-)
]
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)