]> git.ipfire.org Git - thirdparty/linux.git/commit
cpuidle: governors: menu: Always check timers with tick stopped
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 20 Jan 2026 15:26:14 +0000 (16:26 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 23 Jan 2026 20:22:42 +0000 (21:22 +0100)
commit80606f4eb8d7484ab7f7d6f0fd30d71e6fbcf328
tree7da64327b93aa206bda5979ea872903c1ebc18b9
parentfd0d2872dc53fe55f66842767e952457348b8d18
cpuidle: governors: menu: Always check timers with tick stopped

After commit 5484e31bbbff ("cpuidle: menu: Skip tick_nohz_get_sleep_length()
call in some cases"), if the return value of get_typical_interval()
multiplied by NSEC_PER_USEC is not greater than RESIDENCY_THRESHOLD_NS,
the menu governor will skip computing the time till the closest timer.
If that happens when the tick has been stopped already, the selected
idle state may be too deep due to the subsequent check comparing
predicted_ns with TICK_NSEC and causing its value to be replaced with
the expected time till the closest timer, which is KTIME_MAX in that
case.  That will cause the deepest enabled idle state to be selected,
but the time till the closest timer very well may be shorter than the
target residency of that state, in which case a shallower state should
be used.

Address this by making menu_select() always compute the time till the
closest timer when the tick has been stopped.

Also move the predicted_ns check mentioned above into the branch in
which the time till the closest timer is determined because it only
needs to be done in that case.

Fixes: 5484e31bbbff ("cpuidle: menu: Skip tick_nohz_get_sleep_length() call in some cases")
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Christian Loehle <christian.loehle@arm.com>
Link: https://patch.msgid.link/5959091.DvuYhMxLoT@rafael.j.wysocki
drivers/cpuidle/governors/menu.c