• Zhiquan Li's avatar
    x86/acpi: Remove __ro_after_init from acpi_mp_wake_mailbox · ab84ba64
    Zhiquan Li authored
    On a platform using the "Multiprocessor Wakeup Structure"[1] to startup
    secondary CPUs the control processor needs to memremap() the physical
    address of the MP Wakeup Structure mailbox to the variable
    acpi_mp_wake_mailbox, which holds the virtual address of mailbox.
    
    To wake up the AP the control processor writes the APIC ID of AP, the
    wakeup vector and the ACPI_MP_WAKE_COMMAND_WAKEUP command into the mailbox.
    
    Current implementation doesn't consider the case which restricts boot time
    CPU bringup to 1 with the kernel parameter "maxcpus=1" and brings other
    CPUs online later from user space as it sets acpi_mp_wake_mailbox to
    read-only after init.  So when the first AP is tried to brought online
    after init, the attempt to update the variable results in a kernel panic.
    
    The memremap() call that initializes the variable cannot be moved into
    acpi_parse_mp_wake() because memremap() is not functional at that point in
    the boot process. Also as the APs might never be brought up, keep the
    memremap() call in acpi_wakeup_cpu() so that the operation only takes place
    when needed.
    
    Fixes: 24dd05da ("x86/apic: Mark acpi_mp_wake_* variables as __ro_after_init")
    Signed-off-by: default avatarZhiquan Li <zhiquan1.li@intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Reviewed-by: default avatarKirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Link: https://lore.kernel.org/all/20240805103531.1230635-1-zhiquan1.li@intel.com
    ab84ba64
madt_wakeup.c 8.33 KB