Messages in this thread | | | From | Thomas Gleixner <> | Subject | Re: [PATCHv6 21/30] x86/acpi, x86/boot: Add multiprocessor wake-up support | Date | Thu, 17 Mar 2022 13:44:53 +0100 |
| |
On Wed, Mar 16 2022 at 05:08, Kirill A. Shutemov wrote: > +#ifdef CONFIG_X86_64 > +/* Virtual address of the Multiprocessor Wakeup Structure mailbox */ > +static int acpi_wakeup_cpu(int apicid, unsigned long start_ip) > +{ > + static physid_mask_t apic_id_wakemap = PHYSID_MASK_NONE; > + u8 timeout; > + > + /* Remap mailbox memory only for the first call to acpi_wakeup_cpu() */ > + if (physids_empty(apic_id_wakemap)) {
I had to read this condition twice.
Why not checking (!acpi_mp_wake_mailbox)? Too obvious, right?
> + acpi_mp_wake_mailbox = memremap(acpi_mp_wake_mailbox_paddr, > + sizeof(*acpi_mp_wake_mailbox), > + MEMREMAP_WB); > + } > + > + /* > + * According to the ACPI specification r6.4, section titled > + * "Multiprocessor Wakeup Structure" the mailbox-based wakeup > + * mechanism cannot be used more than once for the same CPU. > + * Skip wakeups if they are attempted more than once. > + */ > + if (physid_isset(apicid, apic_id_wakemap)) { > + pr_err("CPU already awake (APIC ID %x), skipping wakeup\n", > + apicid); > + return -EINVAL; > + } > + > + spin_lock(&mailbox_lock);
What is this lock actually protecting? Wakeup of secondary CPUs is fully serialized in the core code already.
Thanks,
tglx
| |