On 2026.01.20 07:26 Rafael J. Wysocki wrote: >From: Rafael J. Wysocki > > 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 ... snip ... I have been testing with this patch, and have not observed any difference in test results and energy use with and without this patch. A couple of graphs are attached. I did this work on top of the teo work, so those results are on the graphs also. Legend: rc5 = kernel 6.19-rc5 rjw = kernel 6.19-rc5 + original teo 5 patch set rjw-1-1 = kernel 6.19-rc5 + current teo 5 patch set (note: Not including the most recent V2 of patch 5 of 5, now a newer 2 patch set.) menu = kernel 6.19-rc5 menu-rjw = kernel 6.19-rc5 + this patch. disable = all idle states except state 0 disabled, as a reference plot, at the cost of energy.