mirror of
https://github.com/torvalds/linux.git
synced 2025-12-01 07:26:02 +07:00
cpuidle: governors: menu: Select polling state in some more cases
A throughput regression of 11% introduced by commit779b1a1cb1("cpuidle: governors: menu: Avoid selecting states with too much latency") has been reported and it is related to the case when the menu governor checks if selecting a proper idle state instead of a polling one makes sense. In particular, it is questionable to do so if the exit latency of the idle state in question exceeds the predicted idle duration, so add a check for that, which is sufficient to make the reported regression go away, and update the related code comment accordingly. Fixes:779b1a1cb1("cpuidle: governors: menu: Avoid selecting states with too much latency") Closes: https://lore.kernel.org/linux-pm/004501dc43c9$ec8aa930$c59ffb90$@telus.net/ Reported-by: Doug Smythies <dsmythies@telus.net> Tested-by: Doug Smythies <dsmythies@telus.net> Cc: All applicable <stable@vger.kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Christian Loehle <christian.loehle@arm.com> Link: https://patch.msgid.link/12786727.O9o76ZdvQC@rafael.j.wysocki
This commit is contained in:
@@ -318,10 +318,13 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Use a physical idle state, not busy polling, unless a timer
|
* Use a physical idle state, not busy polling, unless a timer
|
||||||
* is going to trigger soon enough.
|
* is going to trigger soon enough or the exit latency of the
|
||||||
|
* idle state in question is greater than the predicted idle
|
||||||
|
* duration.
|
||||||
*/
|
*/
|
||||||
if ((drv->states[idx].flags & CPUIDLE_FLAG_POLLING) &&
|
if ((drv->states[idx].flags & CPUIDLE_FLAG_POLLING) &&
|
||||||
s->target_residency_ns <= data->next_timer_ns) {
|
s->target_residency_ns <= data->next_timer_ns &&
|
||||||
|
s->exit_latency_ns <= predicted_ns) {
|
||||||
predicted_ns = s->target_residency_ns;
|
predicted_ns = s->target_residency_ns;
|
||||||
idx = i;
|
idx = i;
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user