LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rafael@kernel.org> To: Linux PM <linux-pm@vger.kernel.org> Cc: Peter Zijlstra <peterz@infradead.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> Subject: Re: [RFT][PATCH v7 5/8] cpuidle: Return nohz hint from cpuidle_select() Date: Wed, 21 Mar 2018 15:36:39 +0100 [thread overview] Message-ID: <CAJZ5v0j-CnEms-Wm0Op=386ceuG2GfAouVLXO48rbD_pUPJhMg@mail.gmail.com> (raw) In-Reply-To: <1635957.yuHkCe9oyz@aspire.rjw.lan> On Tue, Mar 20, 2018 at 4:45 PM, Rafael J. Wysocki <rjw@rjwysocki.net> wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > Add a new pointer argument to cpuidle_select() and to the ->select > cpuidle governor callback to allow a boolean value indicating > whether or not the tick should be stopped before entering the > selected state to be returned from there. > > Make the ladder governor ignore that pointer (to preserve its > current behavior) and make the menu governor return 'false" through > it if: > (1) the idle exit latency is constrained at 0, or > (2) the selected state is a polling one, or > (3) the expected idle period duration is within the tick period > range. > > In addition to that, the correction factor computations in the menu > governor need to take the possibility that the tick may not be > stopped into account to avoid artificially small correction factor > values. To that end, add a mechanism to record tick wakeups, as > suggested by Peter Zijlstra, and use it to modify the menu_update() > behavior when tick wakeup occurs. Namely, make it add a (sufficiently > large) constant value to the correction factor in these cases (instead > of increasing the correction factor by a value based on the > measured idle time). > > Since the value returned through the new argument pointer of > cpuidle_select() is not used by its caller yet, this change by > itself is not expected to alter the functionality of the code. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > > v5 -> v7: > * Rename the new cpuidle_select() arg (and some related things) from > "nohz" to "stop_tick" (as requested by Peter). > * Use TICK_USEC from the previous patch. > * Record tick wakeups (as suggested by Peter) and use them to take the > tick into account in menu_update(). [cut] > @@ -427,31 +449,44 @@ static void menu_update(struct cpuidle_d > * assume the state was never reached and the exit latency is 0. > */ > > - /* measured value */ > - measured_us = cpuidle_get_last_residency(dev); > - > - /* Deduct exit latency */ > - if (measured_us > 2 * target->exit_latency) > - measured_us -= target->exit_latency; > - else > - measured_us /= 2; > - > - /* Make sure our coefficients do not exceed unity */ > - if (measured_us > data->next_timer_us) > - measured_us = data->next_timer_us; > - > /* Update our correction ratio */ > new_factor = data->correction_factor[data->bucket]; > new_factor -= new_factor / DECAY; > > - if (data->next_timer_us > 0 && measured_us < MAX_INTERESTING) > - new_factor += RESOLUTION * measured_us / data->next_timer_us; > - else > + if (data->tick_wakeup) { This should check if data->next_timer_us is greater than TICK_USEC too, but also the measured_us computation needs to go before it (or uninitialized measured_us will be used later on if this branch is executed). So please disregard this one entirely and take the v7.2 replacement instead of it: https://patchwork.kernel.org/patch/10299429/ The current versions (including the above) is in the git branch at git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git \ idle-loop-v7.2 > /* > - * we were idle so long that we count it as a perfect > - * prediction > + * If the CPU was woken up by the tick, it might have been idle > + * for a much longer time if the tick had been stopped. That > + * time cannot be determined, so asssume that it would have been > + * long, but not as long as the original return value of > + * tick_nohz_get_sleep_length(). Use a number between 0.5 and > + * 1, something like 0.75 (which is easy enough to get), that > + * should work on the average. > */ > - new_factor += RESOLUTION; > + new_factor += RESOLUTION / 2 + RESOLUTION / 4; > + } else { > + /* measured value */ > + measured_us = cpuidle_get_last_residency(dev); > + > + /* Deduct exit latency */ > + if (measured_us > 2 * target->exit_latency) > + measured_us -= target->exit_latency; > + else > + measured_us /= 2; > + > + /* Make sure our coefficients do not exceed unity */ > + if (measured_us > data->next_timer_us) > + measured_us = data->next_timer_us; > + > + if (data->next_timer_us > 0 && measured_us < MAX_INTERESTING) > + new_factor += RESOLUTION * measured_us / data->next_timer_us; > + else > + /* > + * we were idle so long that we count it as a perfect > + * prediction > + */ > + new_factor += RESOLUTION; > + } > > /* > * We don't want 0 as factor; we always want at least
next prev parent reply other threads:[~2018-03-21 14:36 UTC|newest] Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-03-20 15:12 [RFT][PATCH v7 0/8] sched/cpuidle: Idle loop rework Rafael J. Wysocki 2018-03-20 15:13 ` [RFT][PATCH v7 1/8] time: tick-sched: Reorganize idle tick management code Rafael J. Wysocki 2018-03-20 15:15 ` [RFT][PATCH v7 2/8] sched: idle: Do not stop the tick upfront in the idle loop Rafael J. Wysocki 2018-03-20 15:15 ` [RFT][PATCH v7 3/8] " Rafael J. Wysocki 2018-03-20 18:00 ` [Correction][RFT][PATCH v7 3/8] sched: idle: Do not stop the tick before cpuidle_idle_call() Rafael J. Wysocki 2018-03-20 15:16 ` [RFT][PATCH v7 4/8] jiffies: Introduce USER_TICK_USEC and redefine TICK_USEC Rafael J. Wysocki 2018-03-20 15:45 ` [RFT][PATCH v7 5/8] cpuidle: Return nohz hint from cpuidle_select() Rafael J. Wysocki 2018-03-21 6:48 ` [RFT][PATCH v7.1 " Rafael J. Wysocki 2018-03-21 11:52 ` Rafael J. Wysocki 2018-03-21 13:03 ` [RFT][PATCH v7.2 " Rafael J. Wysocki 2018-03-21 14:36 ` Rafael J. Wysocki [this message] 2018-03-21 17:59 ` [RFT][PATCH v7 " Thomas Ilsche 2018-03-21 22:15 ` Rafael J. Wysocki 2018-03-22 13:18 ` Thomas Ilsche 2018-03-22 17:23 ` Rafael J. Wysocki 2018-03-22 6:24 ` Doug Smythies 2018-03-22 15:41 ` Doug Smythies 2018-03-22 17:21 ` Rafael J. Wysocki 2018-03-21 18:23 ` Doug Smythies 2018-03-22 17:40 ` [RFT][PATCH v7.3 " Rafael J. Wysocki 2018-03-28 9:14 ` Thomas Ilsche 2018-03-30 9:39 ` Rafael J. Wysocki 2018-04-10 15:22 ` Thomas Ilsche 2018-03-22 20:46 ` Doug Smythies 2018-03-20 15:45 ` [RFT][PATCH v7 6/8] sched: idle: Select idle state before stopping the tick Rafael J. Wysocki 2018-03-27 21:50 ` Thomas Ilsche 2018-03-27 22:10 ` Rafael J. Wysocki 2018-03-28 8:13 ` Rafael J. Wysocki 2018-03-28 8:38 ` Thomas Ilsche 2018-03-28 10:37 ` Rafael J. Wysocki 2018-03-28 10:56 ` Rafael J. Wysocki 2018-03-28 15:15 ` Thomas Ilsche 2018-03-28 20:41 ` Doug Smythies 2018-03-28 23:11 ` Rafael J. Wysocki 2018-03-20 15:46 ` [RFT][PATCH v7 7/8] cpuidle: menu: Refine idle state selection for running tick Rafael J. Wysocki 2018-03-20 15:47 ` [RFT][PATCH v7 8/8] cpuidle: menu: Avoid selecting shallow states with stopped tick Rafael J. Wysocki 2018-03-20 17:52 ` [RFT][PATCH v7 3/8] sched: idle: Do not stop the tick upfront in the idle loop Doug Smythies 2018-03-20 18:01 ` Rafael J. Wysocki 2018-03-21 12:31 ` [RFT][PATCH v7 0/8] sched/cpuidle: Idle loop rework Rik van Riel 2018-03-21 13:55 ` Rafael J. Wysocki 2018-03-21 14:53 ` Rik van Riel
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='CAJZ5v0j-CnEms-Wm0Op=386ceuG2GfAouVLXO48rbD_pUPJhMg@mail.gmail.com' \ --to=rafael@kernel.org \ --cc=aubrey.li@linux.intel.com \ --cc=dsmythies@telus.net \ --cc=fweisbec@gmail.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=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: linkBe 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).