linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rafael@kernel.org>
To: Peter Zijlstra <peterz@infradead.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Linux PM <linux-pm@vger.kernel.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Paul McKenney <paulmck@linux.vnet.ibm.com>,
	Thomas Ilsche <thomas.ilsche@tu-dresden.de>,
	Doug Smythies <dsmythies@telus.net>,
	Rik van Riel <riel@surriel.com>,
	Aubrey Li <aubrey.li@linux.intel.com>,
	Mike Galbraith <mgalbraith@suse.de>,
	LKML <linux-kernel@vger.kernel.org>,
	Len Brown <len.brown@intel.com>
Subject: Re: [PATCH v9 10/10] cpuidle: menu: Avoid selecting shallow states with stopped tick
Date: Thu, 5 Apr 2018 16:29:29 +0200	[thread overview]
Message-ID: <CAJZ5v0iJx7qfPTVMJbXJRSL-K9KstMPD2JYXjeQQn+vsQHe6HA@mail.gmail.com> (raw)
In-Reply-To: <20180405141326.GH4129@hirez.programming.kicks-ass.net>

On Thu, Apr 5, 2018 at 4:13 PM, Peter Zijlstra <peterz@infradead.org> wrote:
> On Thu, Apr 05, 2018 at 04:11:27PM +0200, Peter Zijlstra wrote:
>> On Thu, Apr 05, 2018 at 03:49:32PM +0200, Rafael J. Wysocki wrote:
>> > On Thu, Apr 5, 2018 at 2:47 PM, Peter Zijlstra <peterz@infradead.org> wrote:
>> > > On Wed, Apr 04, 2018 at 10:50:36AM +0200, Rafael J. Wysocki wrote:
>> > >> +     if (tick_nohz_tick_stopped()) {
>> > >> +             /*
>> > >> +              * If the tick is already stopped, the cost of possible short
>> > >> +              * idle duration misprediction is much higher, because the CPU
>> > >> +              * may be stuck in a shallow idle state for a long time as a
>> > >> +              * result of it.  In that case say we might mispredict and try
>> > >> +              * to force the CPU into a state for which we would have stopped
>> > >> +              * the tick, unless the tick timer is going to expire really
>> > >> +              * soon anyway.
>> > >
>> > > Wait what; the tick was stopped, therefore it _cannot_ expire soon.
>> > >
>> > > *confused*
>> > >
>> > > Did you mean s/tick/a/ ?
>> >
>> > Yeah, that should be "a timer".
>>
>> *phew* ok, that makes a lot more sense ;-)
>>
>> My only concern with this is that we can now be overly pessimistic. The
>> predictor might know that statistically it's very likely a device
>> interrupt will arrive soon, but because the tick is already disabled, we
>> don't dare trust it, causing possible excessive latencies.

That's possible, but then we already stopped the tick before and the
CPU was in a deep idle state (or we wouldn't have got here with the
tick stopped), so the extra bit of latency coming from this is not
likely to matter IMO.

And the code can stay simpler this way. :-)

>> Would an alternative be to make @stop_tick be an enum capable of forcing
>> the tick back on?
>>
>> enum tick_action {
>>       NOHZ_TICK_STOP,
>>       NOHZ_TICK_RETAIN,
>>       NOHZ_TICK_START,
>> };
>>
>>       enum tick_action tick_action = NOHZ_TICK_STOP;
>>
>>       state = cpuidle_select(..., &tick_action);
>>
>>       switch (tick_action) {
>>       case NOHZ_TICK_STOP:
>>               tick_nohz_stop_tick();
>>               break;
>>
>>       case NOHZ_TICK_RETAIN:
>>               tick_nozh_retain_tick();
>>               break;
>>
>>       case NOHZ_TICK_START:
>>               tick_nohz_start_tick();
>>               break;
>>       };
>>
>>
>> Or something along those lines?
>
> To clarify, RETAIN keeps the status quo, if its off, it stays off, if
> its on it stays on.

That could be done, but I'm not sure if the menu governor has a good
way to decide whether to use NOHZ_TICK_RETAIN or NOHZ_TICK_START.

Doing NOHZ_TICK_START every time the predicted idle duration is within
the tick range may be wasteful.

Besides, enum tick_action and so on can be introduced later if really
needed, but for now it looks like the simpler code gets the job done.

  reply	other threads:[~2018-04-05 14:29 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-04  8:32 [PATCH v9 00/10] sched/cpuidle: Idle loop rework Rafael J. Wysocki
2018-04-04  8:33 ` [PATCH v9 01/10] time: tick-sched: Reorganize idle tick management code Rafael J. Wysocki
2018-04-04  8:34 ` [PATCH v9 02/10] sched: idle: Do not stop the tick upfront in the idle loop Rafael J. Wysocki
2018-04-04  8:36 ` [PATCH v9 03/10] sched: idle: Do not stop the tick before cpuidle_idle_call() Rafael J. Wysocki
2018-04-04  8:38 ` [PATCH v9 04/10] jiffies: Introduce USER_TICK_USEC and redefine TICK_USEC Rafael J. Wysocki
2018-04-06  1:09   ` Frederic Weisbecker
2018-04-06  7:20     ` Rafael J. Wysocki
2018-04-04  8:39 ` [PATCH v9 05/10] cpuidle: Return nohz hint from cpuidle_select() Rafael J. Wysocki
2018-04-06  2:44   ` Frederic Weisbecker
2018-04-06  7:24     ` Rafael J. Wysocki
2018-04-06 14:19       ` Frederic Weisbecker
2018-04-06  7:58     ` Peter Zijlstra
2018-04-06 14:23       ` Frederic Weisbecker
2018-04-06  8:11     ` Rafael J. Wysocki
2018-04-06 12:56       ` Rafael J. Wysocki
2018-04-06 15:28         ` Frederic Weisbecker
2018-04-06 14:28       ` Frederic Weisbecker
2018-04-04  8:41 ` [PATCH v9 06/10] time: tick-sched: Split tick_nohz_stop_sched_tick() Rafael J. Wysocki
2018-04-07  2:36   ` Frederic Weisbecker
2018-04-07 16:36     ` Rafael J. Wysocki
2018-04-04  8:45 ` [PATCH v9 07/10] time: hrtimer: Introduce hrtimer_next_event_without() Rafael J. Wysocki
2018-04-07 14:46   ` Frederic Weisbecker
2018-04-08  8:20     ` Rafael J. Wysocki
2018-04-08 17:58       ` Frederic Weisbecker
2018-04-04  8:47 ` [PATCH v9 08/10] sched: idle: Select idle state before stopping the tick Rafael J. Wysocki
2018-04-09  2:41   ` Frederic Weisbecker
2018-04-04  8:49 ` [PATCH v9 09/10] cpuidle: menu: Refine idle state selection for running tick Rafael J. Wysocki
2018-04-05 12:27   ` Peter Zijlstra
2018-04-05 13:51     ` Rafael J. Wysocki
2018-04-05 12:32   ` Peter Zijlstra
2018-04-05 13:52     ` Rafael J. Wysocki
2018-04-04  8:50 ` [PATCH v9 10/10] cpuidle: menu: Avoid selecting shallow states with stopped tick Rafael J. Wysocki
2018-04-05 12:47   ` Peter Zijlstra
2018-04-05 13:49     ` Rafael J. Wysocki
2018-04-05 14:11       ` Peter Zijlstra
2018-04-05 14:13         ` Peter Zijlstra
2018-04-05 14:29           ` Rafael J. Wysocki [this message]
2018-04-08 16:32 ` [PATCH v9 00/10] sched/cpuidle: Idle loop rework Rafael J. Wysocki
2018-04-09 15:58   ` Thomas Ilsche
2018-04-10  7:03     ` Rafael J. Wysocki

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=CAJZ5v0iJx7qfPTVMJbXJRSL-K9KstMPD2JYXjeQQn+vsQHe6HA@mail.gmail.com \
    --to=rafael@kernel.org \
    --cc=aubrey.li@linux.intel.com \
    --cc=dsmythies@telus.net \
    --cc=fweisbec@gmail.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=mgalbraith@suse.de \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=peterz@infradead.org \
    --cc=riel@surriel.com \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=thomas.ilsche@tu-dresden.de \
    /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).