]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/smp: Don't send INIT to boot CPU
authorThomas Gleixner <tglx@linutronix.de>
Wed, 5 Jul 2023 08:59:23 +0000 (10:59 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 7 Jul 2023 13:42:31 +0000 (15:42 +0200)
Parking CPUs in INIT works well, except for the crash case when the CPU
which invokes smp_park_other_cpus_in_init() is not the boot CPU. Sending
INIT to the boot CPU resets the whole machine.

Prevent this by validating that this runs on the boot CPU. If not fall back
and let CPUs hang in HLT.

Fixes: 45e34c8af58f ("x86/smp: Put CPUs into INIT on shutdown if possible")
Reported-by: Baokun Li <libaokun1@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Baokun Li <libaokun1@huawei.com>
Link: https://lore.kernel.org/r/87ttui91jo.ffs@tglx
arch/x86/kernel/smpboot.c

index 4ee43396b9102481d6de4957b08d8d3f2f06e8ec..7417d9b55b2193102c9a013ee5aace7ecae906ca 100644 (file)
@@ -1473,6 +1473,14 @@ bool smp_park_other_cpus_in_init(void)
        if (apic->wakeup_secondary_cpu_64 || apic->wakeup_secondary_cpu)
                return false;
 
+       /*
+        * If this is a crash stop which does not execute on the boot CPU,
+        * then this cannot use the INIT mechanism because INIT to the boot
+        * CPU will reset the machine.
+        */
+       if (this_cpu)
+               return false;
+
        for_each_present_cpu(cpu) {
                if (cpu == this_cpu)
                        continue;