From: Nicholas Piggin <npiggin@gmail.com>
To: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org,
"Gautham R . Shenoy" <ego@linux.vnet.ibm.com>,
"Shreyas B . Prabhu" <shreyas@linux.vnet.ibm.com>
Subject: Re: [PATCH 12/14] powerpc/64s: cpuidle no memory barrier after break from idle
Date: Tue, 13 Jun 2017 22:47:13 +1000 [thread overview]
Message-ID: <20170613224713.2554e0c9@roar.ozlabs.ibm.com> (raw)
In-Reply-To: <20170612174844.GC4340@drishya.in.ibm.com>
On Mon, 12 Jun 2017 23:18:44 +0530
Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> wrote:
> * Nicholas Piggin <npiggin@gmail.com> [2017-06-12 09:58:33]:
>
> > A memory barrier is not required after the task wakes up,
> > only if we clear the polling flag before waking. The case
> > where we have work to do is the important one, so optimise
> > for it.
> >
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>
> Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com>
>
>
> > ---
> > drivers/cpuidle/cpuidle-powernv.c | 11 +++++++++--
> > drivers/cpuidle/cpuidle-pseries.c | 11 +++++++++--
> > 2 files changed, 18 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/cpuidle/cpuidle-powernv.c b/drivers/cpuidle/cpuidle-powernv.c
> > index 9d03326ac05e..37b0698b7193 100644
> > --- a/drivers/cpuidle/cpuidle-powernv.c
> > +++ b/drivers/cpuidle/cpuidle-powernv.c
> > @@ -59,14 +59,21 @@ static int snooze_loop(struct cpuidle_device *dev,
> > ppc64_runlatch_off();
> > HMT_very_low();
> > while (!need_resched()) {
> > - if (likely(snooze_timeout_en) && get_tb() > snooze_exit_time)
> > + if (likely(snooze_timeout_en) && get_tb() > snooze_exit_time) {
> > + /*
> > + * Task has not woken up but we are exiting the polling
> > + * loop anyway. Require a barrier after polling is
> > + * cleared to order subsequent test of need_resched().
> > + */
> > + clear_thread_flag(TIF_POLLING_NRFLAG);
> > + smp_mb();
> > break;
> > + }
> > }
> >
> > HMT_medium();
> > ppc64_runlatch_on();
> > clear_thread_flag(TIF_POLLING_NRFLAG);
> > - smp_mb();
>
> If we reach here without executing if(snooze_timeout) with the
> barrier+break, that means we have seen the need_resched flag and hence
> we can avoid the barrier. Clearing of the polling flag can be seen
> (take affect) later as we will exit the idle loop and re-enter anyway
> at this point. The caller also will check for need_resched and exit
> the idle loop.
>
> Actually do_idle() has a __current_set_polling() and
> __current_clr_polling() in the default idle loop. Do we really need
> to set/clear the TIF_POLLING_NRFLAG again in cpuidle driver?
We do because cpuidle drivers are entered with POLLING clear, don't
they?
It would be nice to have the entire scheduler idle including cpuidle
entry run with POLLING set. It would then be up to interrupt-based
cpuidle drivers to clear POLLING before sleeping. I think that should
remove... maybe 4 atomic ops from the most performance-critical idle
states (the polling ones).
That's a bigger change though and will touch many archs and core code.
Thanks,
Nick
next prev parent reply other threads:[~2017-06-13 12:47 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-11 23:58 [PATCH 00/14 v2] idle performance improvements Nicholas Piggin
2017-06-11 23:58 ` [PATCH 01/14] powerpc/64s: idle move soft interrupt mask logic into C code Nicholas Piggin
2017-06-12 8:37 ` Gautham R Shenoy
2017-06-12 14:46 ` Nicholas Piggin
2017-06-13 4:28 ` Gautham R Shenoy
2017-06-11 23:58 ` [PATCH 02/14] powerpc/64s: idle hotplug lazy-irq simplification Nicholas Piggin
2017-06-11 23:58 ` [PATCH 03/14] powerpc/64s: idle provide a default idle for POWER9 Nicholas Piggin
2017-06-12 8:53 ` Gautham R Shenoy
2017-06-12 14:46 ` Nicholas Piggin
2017-06-11 23:58 ` [PATCH 04/14] powerpc/64s: idle process interrupts from system reset wakeup Nicholas Piggin
2017-06-12 9:41 ` Gautham R Shenoy
2017-06-12 14:51 ` Nicholas Piggin
2017-06-11 23:58 ` [PATCH 05/14] powerpc/64s: msgclr when handling doorbell exceptions Nicholas Piggin
2017-06-12 14:38 ` Gautham R Shenoy
2017-06-11 23:58 ` [PATCH 06/14] powerpc/64s: interrupt replay balance the return branch predictor Nicholas Piggin
2017-06-12 14:41 ` Gautham R Shenoy
2017-06-13 9:51 ` Michael Ellerman
2017-06-13 11:09 ` Nicholas Piggin
2017-06-11 23:58 ` [PATCH 07/14] powerpc/64s: idle branch to handler with virtual mode offset Nicholas Piggin
2017-06-11 23:58 ` [PATCH 08/14] powerpc/64s: idle avoid SRR usage in idle sleep/wake paths Nicholas Piggin
2017-06-13 10:25 ` Gautham R Shenoy
2017-06-13 10:45 ` Nicholas Piggin
2017-06-11 23:58 ` [PATCH 09/14] powerpc/64s: idle hmi wakeup is unlikely Nicholas Piggin
2017-06-12 15:03 ` Gautham R Shenoy
2017-06-11 23:58 ` [PATCH 10/14] powerpc/64s: cpuidle set polling before enabling irqs Nicholas Piggin
2017-06-12 15:10 ` Gautham R Shenoy
2017-06-12 15:20 ` Nicholas Piggin
2017-06-11 23:58 ` [PATCH 11/14] powerpc/64s: cpuidle read mostly for common globals Nicholas Piggin
2017-06-12 15:30 ` Gautham R Shenoy
2017-06-12 17:50 ` Vaidyanathan Srinivasan
2017-06-11 23:58 ` [PATCH 12/14] powerpc/64s: cpuidle no memory barrier after break from idle Nicholas Piggin
2017-06-12 17:48 ` Vaidyanathan Srinivasan
2017-06-13 12:47 ` Nicholas Piggin [this message]
2017-06-11 23:58 ` [PATCH 13/14] powerpc/64: runlatch CTRL[RUN] set optimisation Nicholas Piggin
2017-06-12 17:11 ` Vaidyanathan Srinivasan
2017-06-13 10:04 ` Michael Ellerman
2017-06-13 11:56 ` Nicholas Piggin
2017-06-13 13:45 ` Benjamin Herrenschmidt
2017-06-14 3:34 ` Michael Ellerman
2017-06-11 23:58 ` [PATCH 14/14] powerpc/64s: idle runlatch switch is done with MSR[EE]=0 Nicholas Piggin
2017-06-12 17:00 ` Vaidyanathan Srinivasan
-- strict thread matches above, loose matches on Subject: below --
2017-06-08 15:50 [PATCH 00/14] idle performance improvements Nicholas Piggin
2017-06-08 15:51 ` [PATCH 12/14] powerpc/64s: cpuidle no memory barrier after break from idle Nicholas Piggin
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=20170613224713.2554e0c9@roar.ozlabs.ibm.com \
--to=npiggin@gmail.com \
--cc=ego@linux.vnet.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=shreyas@linux.vnet.ibm.com \
--cc=svaidy@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;
as well as URLs for NNTP newsgroup(s).