lkml.org 
[lkml]   [2021]   [May]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [PATCH v3 3/3] x86/acpi, x86/boot: Add multiprocessor wake-up support
From
Date


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
\
 
 \ /
  Last update: 2021-05-10 23:16    [W:0.111 / U:0.348 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site