Skip to content

Commit e5c9ffc

Browse files
AboorvaDevarajanrafaeljw
authored andcommitted
cpuidle: Skip governor when only one idle state is available
On certain platforms (PowerNV systems without a power-mgt DT node), cpuidle may register only a single idle state. In cases where that single state is a polling state (state 0), the ladder governor may incorrectly treat state 1 as the first usable state and pass an out-of-bounds index. This can lead to a NULL enter callback being invoked, ultimately resulting in a system crash. [ 13.342636] cpuidle-powernv : Only Snooze is available [ 13.351854] Faulting instruction address: 0x00000000 [ 13.376489] NIP [0000000000000000] 0x0 [ 13.378351] LR [c000000001e01974] cpuidle_enter_state+0x2c4/0x668 Fix this by adding a bail-out in cpuidle_select() that returns state 0 directly when state_count <= 1, bypassing the governor and keeping the tick running. Fixes: dc2251b ("cpuidle: Eliminate the CPUIDLE_DRIVER_STATE_START symbol") Signed-off-by: Aboorva Devarajan <aboorvad@linux.ibm.com> Reviewed-by: Christian Loehle <christian.loehle@arm.com> Link: https://patch.msgid.link/20260216185005.1131593-2-aboorvad@linux.ibm.com Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent c900e33 commit e5c9ffc

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

drivers/cpuidle/cpuidle.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,16 @@ noinstr int cpuidle_enter_state(struct cpuidle_device *dev,
359359
int cpuidle_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
360360
bool *stop_tick)
361361
{
362+
/*
363+
* If there is only a single idle state (or none), there is nothing
364+
* meaningful for the governor to choose. Skip the governor and
365+
* always use state 0 with the tick running.
366+
*/
367+
if (drv->state_count <= 1) {
368+
*stop_tick = false;
369+
return 0;
370+
}
371+
362372
return cpuidle_curr_governor->select(drv, dev, stop_tick);
363373
}
364374

0 commit comments

Comments
 (0)