Re: [PATCH v3 3/3] x86/acpi, x86/boot: Add multiprocessor wake-up support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





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



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux