Messages in this thread Patch in this message | | | Subject | Re: [PATCH v3 3/3] x86/acpi, x86/boot: Add multiprocessor wake-up support | From | "Kuppuswamy, Sathyanarayanan" <> | Date | Mon, 10 May 2021 14:15:29 -0700 |
| |
On 5/10/21 10:24 AM, Rafael J. Wysocki wrote: > The wakeup function can return an error when it is called for the > second time on the same CPU.
To do this, we can only maintain the wakeup status of the CPUs. Can you check whether following physid_mask based status maintenance is acceptable?
--- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -67,6 +67,7 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
static struct acpi_madt_multiproc_wakeup_mailbox *acpi_mp_wake_mailbox; static u64 acpi_mp_wake_mailbox_paddr; +static physid_mask_t apic_id_wakemap = PHYSID_MASK_NONE;
#ifdef CONFIG_X86_IO_APIC /* @@ -347,6 +348,13 @@ static int acpi_wakeup_cpu(int apicid, unsigned long start_ip)
acpi_mp_wake_mailbox_init();
+ /* Check if the given CPU (apicid) is already awake */ + if (physid_isset(apicid, apic_id_wakemap)) { + pr_err("APIC ID %x is already awake, so failed to wakeup\n", + apicid); + return -EINVAL; + } + if (!acpi_mp_wake_mailbox) return -EINVAL;
@@ -374,8 +382,18 @@ static int acpi_wakeup_cpu(int apicid, unsigned long start_ip) while (READ_ONCE(acpi_mp_wake_mailbox->command) && timeout--) cpu_relax();
- /* If timedout, return error */ - return timeout ? 0 : -EIO; + if (timeout) { + /* + * If the CPU wakeup process is successful, store the + * status in apic_id_wakemap to prevent re-wakeup + * requests. + */ + physid_set(apicid, apic_id_wakemap); + return 0; + } + + /* If timed out (timeout == 0), return error */ + return -EIO; }
-- Sathyanarayanan Kuppuswamy Linux Kernel Developer
| |