Skip to content
/ linux Public

Commit 8f6833d

Browse files
AboorvaDevarajanSasha Levin
authored andcommitted
cpuidle: Skip governor when only one idle state is available
[ Upstream commit e5c9ffc ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent d08fb55 commit 8f6833d

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

drivers/cpuidle/cpuidle.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,16 @@ noinstr int cpuidle_enter_state(struct cpuidle_device *dev,
353353
int cpuidle_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
354354
bool *stop_tick)
355355
{
356+
/*
357+
* If there is only a single idle state (or none), there is nothing
358+
* meaningful for the governor to choose. Skip the governor and
359+
* always use state 0 with the tick running.
360+
*/
361+
if (drv->state_count <= 1) {
362+
*stop_tick = false;
363+
return 0;
364+
}
365+
356366
return cpuidle_curr_governor->select(drv, dev, stop_tick);
357367
}
358368

0 commit comments

Comments
 (0)