Reduce amount of consumed cpu time (i.e. don't spin forever) if number of started cpus are more then expected. And print a bug message into debug port.
And it is not safe to continue to boot if CountCPUs is more than cmos_smp_count and might be still racing, due to mp/acpi could be build with still changing CountCPUs. It is safer to stop and allow user to notice and restart system rather than debug possible inxplicable bugs later.
v2: extendend commit message with explanation why not continue to boot
Signed-off-by: Igor Mammedov imammedo@redhat.com --- src/smp.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/src/smp.c b/src/smp.c index 8c077a1..9933ac6 100644 --- a/src/smp.c +++ b/src/smp.c @@ -115,8 +115,14 @@ smp_probe(void) msleep(10); } else { u8 cmos_smp_count = inb_cmos(CMOS_BIOS_SMP_COUNT); - while (cmos_smp_count + 1 != readl(&CountCPUs)) + while (cmos_smp_count + 1 != readl(&CountCPUs)) { + if (cmos_smp_count + 1 < readl(&CountCPUs)) { + dprintf(1, "BUG: Expected %d cpu(s) but %d cpus started\n", + cmos_smp_count + 1, readl(&CountCPUs)); + hlt(); + } yield(); + } }
// Restore memory.