mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 22:08:33 -04:00
Merge branch 'pm-cpuidle'
Merge a menu governor fix for 6.17-rc3 * pm-cpuidle: cpuidle: governors: menu: Avoid selecting states with too much latency
This commit is contained in:
@@ -287,20 +287,15 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
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 use
|
||||
* the known time till the closest timer event for the idle
|
||||
* state selection.
|
||||
*/
|
||||
if (predicted_ns < TICK_NSEC)
|
||||
predicted_ns = data->next_timer_ns;
|
||||
} else if (latency_req > predicted_ns) {
|
||||
latency_req = predicted_ns;
|
||||
}
|
||||
/*
|
||||
* 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 use the known time till the closest
|
||||
* timer event for the idle state selection.
|
||||
*/
|
||||
if (tick_nohz_tick_stopped() && predicted_ns < TICK_NSEC)
|
||||
predicted_ns = data->next_timer_ns;
|
||||
|
||||
/*
|
||||
* Find the idle state with the lowest power while satisfying
|
||||
@@ -316,13 +311,15 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
|
||||
if (idx == -1)
|
||||
idx = i; /* first enabled state */
|
||||
|
||||
if (s->exit_latency_ns > latency_req)
|
||||
break;
|
||||
|
||||
if (s->target_residency_ns > predicted_ns) {
|
||||
/*
|
||||
* Use a physical idle state, not busy polling, unless
|
||||
* a timer is going to trigger soon enough.
|
||||
*/
|
||||
if ((drv->states[idx].flags & CPUIDLE_FLAG_POLLING) &&
|
||||
s->exit_latency_ns <= latency_req &&
|
||||
s->target_residency_ns <= data->next_timer_ns) {
|
||||
predicted_ns = s->target_residency_ns;
|
||||
idx = i;
|
||||
@@ -354,8 +351,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
|
||||
|
||||
return idx;
|
||||
}
|
||||
if (s->exit_latency_ns > latency_req)
|
||||
break;
|
||||
|
||||
idx = i;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user