From: Michael Ellerman <mpe@ellerman.id.au>
To: "Shreyas B. Prabhu" <shreyas@linux.vnet.ibm.com>
Cc: linux-kernel@vger.kernel.org, Paul Mackerras <paulus@samba.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH] powerpc: powernv: winkle: Restore LPCR with LPCR_PECE1 cleared
Date: Thu, 15 Jan 2015 12:14:27 +1100 [thread overview]
Message-ID: <1421284467.11409.2.camel@ellerman.id.au> (raw)
In-Reply-To: <1421234001-24886-1-git-send-email-shreyas@linux.vnet.ibm.com>
On Wed, 2015-01-14 at 16:43 +0530, Shreyas B. Prabhu wrote:
> LPCR_PECE1 bit controls whether decrementer interrupts are allowed to
> cause exit from power-saving mode. While waking up from winkle, restoring
> LPCR with LPCR_PECE1 set (i.e Decrementer interrupts allowed) can cause
> issue in the following scenario:
>
> - All the threads in a core are offlined. The core enters deep winkle.
> - Spurious interrupt wakes up a thread in the core. Here LPCR is restored
> with LPCR_PECE1 bit set.
> - Since it was a spurious interrupt on a offline thread, the thread clears
> the interrupt and goes back to winkle.
> - Here before the thread executes winkle and puts the core into deep winkle,
> if a decrementer interrupt occurs on any of the sibling threads in the core
> that thread wakes up.
> - Since in offline loop we are flushing interrupt only in case of external
> interrupt, the decrementer interrupt does not get flushed. So at this stage
> the thread is stuck in this is loop of waking up at 0x100 due to decrementer
> interrupt, not flushing the interrupt as only external interrupts get flushed,
> entering winkle, waking up at 0x100 again.
>
> Fix this by programming PORE to restore LPCR with LPCR_PECE1 bit
> cleared when waking up from winkle.
That sounds good.
But this makes the third place where we clear LPCR_PECE1, in addition to:
static int fastsleep_loop(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
{
...
new_lpcr = old_lpcr;
/* Do not exit powersave upon decrementer as we've setup the timer
* offload.
*/
new_lpcr &= ~LPCR_PECE1;
mtspr(SPRN_LPCR, new_lpcr);
And:
static void pnv_smp_cpu_kill_self(void)
{
...
/* We don't want to take decrementer interrupts while we are offline,
* so clear LPCR:PECE1. We keep PECE2 enabled.
*/
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
So perhaps we can capture that logic in one place somehow?
cheers
prev parent reply other threads:[~2015-01-15 1:14 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-14 11:13 Shreyas B. Prabhu
2015-01-15 1:14 ` Michael Ellerman [this message]
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=1421284467.11409.2.camel@ellerman.id.au \
--to=mpe@ellerman.id.au \
--cc=benh@kernel.crashing.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=paulus@samba.org \
--cc=shreyas@linux.vnet.ibm.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®