All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kuppuswamy, Sathyanarayanan"  <sathyanarayanan.kuppuswamy@linux.intel.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J Wysocki <rjw@rjwysocki.net>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, "H . Peter Anvin" <hpa@zytor.com>,
	linux-kernel@vger.kernel.org, x86@kernel.org,
	Sean Christopherson <sean.j.christopherson@intel.com>,
	Andi Kleen <ak@linux.intel.com>
Subject: Re: [PATCH v4 1/1] x86/acpi, x86/boot: Add multiprocessor wake-up support
Date: Fri, 21 May 2021 08:14:45 -0700	[thread overview]
Message-ID: <e4dc31d5-d897-50fa-34e7-f5c033d5f5db@linux.intel.com> (raw)
In-Reply-To: <YKfHiu/a/V/0DS3V@hirez.programming.kicks-ass.net>



On 5/21/21 7:45 AM, Peter Zijlstra wrote:
> On Thu, May 13, 2021 at 02:37:32PM -0700, Kuppuswamy Sathyanarayanan wrote:
>> +static int acpi_wakeup_cpu(int apicid, unsigned long start_ip)
>> +{
>> +	u8 timeout = 0xFF;
>> +
>> +	/* Remap mailbox memory only for the first call to acpi_wakeup_cpu() */
>> +	if (physids_empty(apic_id_wakemap))
>> +		acpi_mp_wake_mailbox = memremap(acpi_mp_wake_mailbox_paddr,
>> +						sizeof(*acpi_mp_wake_mailbox),
>> +						MEMREMAP_WB);
> 
> { } for being multi-line

Yes. I will fix it.

> 
>> +	/*
>> +	 * According to the ACPI specification r6.4, sec 5.2.12.19, the
>> +	 * mailbox-based wakeup mechanism cannot be used more than once
>> +	 * for the same CPU, so skip sending wake commands to already
>> +	 * awake CPU.
>> +	 */
>> +	if (physid_isset(apicid, apic_id_wakemap)) {
>> +		pr_err("CPU already awake (APIC ID %x), skipping wakeup\n",
>> +		       apicid);
>> +		return -EINVAL;
>> +	}
>> +
>> +
>> +	/*
>> +	 * Mailbox memory is shared between firmware and OS. Firmware will
>> +	 * listen on mailbox command address, and once it receives the wakeup
>> +	 * command, CPU associated with the given apicid will be booted. So,
>> +	 * the value of apic_id and wakeup_vector has to be set before updating
>> +	 * the wakeup command. So use WRITE_ONCE to let the compiler know about
>> +	 * it and preserve the order of writes.
>> +	 */
>> +	WRITE_ONCE(acpi_mp_wake_mailbox->apic_id, apicid);
>> +	WRITE_ONCE(acpi_mp_wake_mailbox->wakeup_vector, start_ip);
>> +	WRITE_ONCE(acpi_mp_wake_mailbox->command, ACPI_MP_WAKE_COMMAND_WAKEUP);
> 
> Do those want to be smp_store_release(), in addition to being a volatile
> write, those also include compiler barriers to make sure the compiler
> doesn't lift stuff around.

I think we can use smp_store_release(). Let me test and add it in next
version.

> 
>> +
>> +	/*
>> +	 * After writing wakeup command, wait for maximum timeout of 0xFF
>> +	 * for firmware to reset the command address back zero to indicate
>> +	 * the successful reception of command.
>> +	 * NOTE: 255 as timeout value is decided based on our experiments.
>> +	 *
>> +	 * XXX: Change the timeout once ACPI specification comes up with
>> +	 *      standard maximum timeout value.
>> +	 */
>> +	while (READ_ONCE(acpi_mp_wake_mailbox->command) && timeout--)
>> +		cpu_relax();
> 
> What's the unit of the timeout? The mailbox reads, the PAUSE
> instruction?

Read mailbox memory, timeout dec and then pause. Its more like busy wait loop.

And timeout count is decided based on our experiments. Once spec defines a
standard, we can modify it.

> 
>> +
>> +	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;
>> +}
>> +
>>   #endif				/*CONFIG_X86_LOCAL_APIC */

-- 
Sathyanarayanan Kuppuswamy
Linux Kernel Developer

  reply	other threads:[~2021-05-21 15:17 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-11 10:45 [Devel] Re: [PATCH v3 3/3] x86/acpi, x86/boot: Add multiprocessor wake-up support Rafael J. Wysocki
2021-05-11 10:45 ` Rafael J. Wysocki
2021-05-13 21:37 ` [PATCH v4 1/1] " Kuppuswamy Sathyanarayanan
2021-05-21 14:18   ` Kuppuswamy, Sathyanarayanan
2021-05-21 14:45   ` Peter Zijlstra
2021-05-21 15:14     ` Kuppuswamy, Sathyanarayanan [this message]
2021-05-24  6:02       ` [PATCH v5 " Kuppuswamy Sathyanarayanan
2021-05-24  6:40         ` Mika Penttilä
2021-05-24 13:42           ` Kuppuswamy, Sathyanarayanan
2021-05-24 14:51         ` Rafael J. Wysocki
2021-05-24 15:35           ` Kuppuswamy, Sathyanarayanan
  -- strict thread matches above, loose matches on Subject: below --
2021-05-10 17:23 [Devel] Re: [PATCH v3 3/3] " Rafael J. Wysocki
2021-05-10 17:23 ` Rafael J. Wysocki
2021-04-26  2:39 [PATCH v3 0/3] " Kuppuswamy Sathyanarayanan
2021-04-26  2:39 ` [PATCH v3 1/3] ACPICA: ACPI 6.4: MADT: add Multiprocessor Wakeup Mailbox Structure Kuppuswamy Sathyanarayanan
2021-04-26  2:39 ` [PATCH v3 2/3] ACPI/table: Print MADT Wake table information Kuppuswamy Sathyanarayanan
2021-04-26  2:39 ` [PATCH v3 3/3] x86/acpi, x86/boot: Add multiprocessor wake-up support Kuppuswamy Sathyanarayanan
2021-05-10 16:32   ` Kuppuswamy, Sathyanarayanan
2021-05-10 16:55     ` [Devel] " Rafael J. Wysocki
2021-05-10 16:55       ` Rafael J. Wysocki
2021-05-10 17:10       ` Kuppuswamy, Sathyanarayanan
2021-05-10 17:22         ` Andi Kleen
2021-05-10 17:24           ` [Devel] " Rafael J. Wysocki
2021-05-10 17:24             ` Rafael J. Wysocki
2021-05-10 21:15             ` Kuppuswamy, Sathyanarayanan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e4dc31d5-d897-50fa-34e7-f5c033d5f5db@linux.intel.com \
    --to=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=ak@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rjw@rjwysocki.net \
    --cc=sean.j.christopherson@intel.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.