ACPI MADT doesn't allow to offline CPU after it got woke up. It limits
kexec: the second kernel won't be able to use more than one CPU.

Now acpi_mp_wake_mailbox_paddr already has the mailbox address.
The acpi_wakeup_cpu() will use it to bring up secondary cpus.

Zero out mailbox address in the ACPI MADT wakeup structure to indicate
that the mailbox is not usable.  This prevents the kexec()-ed kernel
from reading a vaild mailbox, which in turn makes the kexec()-ed kernel
only be able to use the boot CPU.

This is Linux-specific protocol and not reflected in ACPI spec.

Booting the second kernel with signle CPU is enough to cover the most
common case for kexec -- kdump.

Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
---
 arch/x86/kernel/acpi/madt_wakeup.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/arch/x86/kernel/acpi/madt_wakeup.c 
b/arch/x86/kernel/acpi/madt_wakeup.c
index 4bc1d5106afd..9bbe829737e7 100644
--- a/arch/x86/kernel/acpi/madt_wakeup.c
+++ b/arch/x86/kernel/acpi/madt_wakeup.c
@@ -13,6 +13,11 @@ static struct acpi_madt_multiproc_wakeup_mailbox 
*acpi_mp_wake_mailbox;
 
 static int acpi_wakeup_cpu(int apicid, unsigned long start_ip)
 {
+       if (!acpi_mp_wake_mailbox_paddr) {
+               pr_warn_once("No MADT mailbox: cannot bringup secondary CPUs. 
Booting with kexec?\n");
+               return -EOPNOTSUPP;
+       }
+
        /*
         * Remap mailbox memory only for the first call to acpi_wakeup_cpu().
         *
@@ -78,6 +83,23 @@ int __init acpi_parse_mp_wake(union acpi_subtable_headers 
*header,
 
        cpu_hotplug_disable_offlining();
 
+       /*
+        * ACPI MADT doesn't allow to offline CPU after it got woke up.
+        * It limits kexec: the second kernel won't be able to use more than
+        * one CPU.
+        *
+        * Now acpi_mp_wake_mailbox_paddr already has the mailbox address.
+        * The acpi_wakeup_cpu() will use it to bring up secondary cpus.
+        *
+        * Zero out mailbox address in the ACPI MADT wakeup structure to
+        * indicate that the mailbox is not usable.  This prevents the
+        * kexec()-ed kernel from reading a vaild mailbox, which in turn
+        * makes the kexec()-ed kernel only be able to use the boot CPU.
+        *
+        * This is Linux-specific protocol and not reflected in ACPI spec.
+        */
+       mp_wake->base_address = 0;
+
        apic_update_callback(wakeup_secondary_cpu_64, acpi_wakeup_cpu);
 
        return 0;
-- 
2.41.0


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to