lkml.org 
[lkml]   [2022]   [Mar]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCHv6 21/30] x86/acpi, x86/boot: Add multiprocessor wake-up support
    Date
    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

    \
     
     \ /
      Last update: 2022-03-17 13:45    [W:3.552 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site