cpuidle: fix broadcast control when broadcast can not be entered
PATCH 1/1 cpuidle: fix broadcast control when broadcast can not be entered
When failing to enter broadcast timer mode for an idle state that requires it, a new state is selected that does not require broadcast, but the broadcast variable remains set. This causes tick_broadcast_exit to be called despite not having entered broadcast mode.
This causes the WARN_ON_ONCE(!irqs_disabled()) to trigger in some cases. It does not appear to cause problems for code today, but seems to violate the interface so should be fixed.
--- drivers/cpuidle/cpuidle.c | 1 + 1 file changed, 1 insertion(+)
drivers/cpuidle/cpuidle.c +1 -0
@@ -208,6 +208,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,return -EBUSY ; } target_state = &drv->states[index]; + broadcast = false; }/* Take note of the planned idle state. */
Signature · 1 line
2.13.3
Quoted 11 lines · Nicholas Piggin
When failing to enter broadcast timer mode for an idle state that requires it, a new state is selected that does not require broadcast, but the broadcast variable remains set. This causes
tick_broadcast_exitto be called despite not having entered broadcast mode.This causes the WARN_ON_ONCE(!irqs_disabled()) to trigger in some cases. It does not appear to cause problems for code today, but seems to violate the interface so should be fixed.
Signed-off-by Nicholas Piggin <[email protected]>
Quoted 20 lines
--- drivers/cpuidle/cpuidle.c | 1 + 1 file changed, 1 insertion(+)drivers/cpuidle/cpuidle.c +1
-0@@ -208,6 +208,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,return -EBUSY ; } target_state = &drv->states[index]; + broadcast = false; }/* Take note of the planned idle state. */ Signature · 1 line
2.13.3
Quoted 8 lines · Thomas Gleixner
Quoted 6 lines · Nicholas Piggin
When failing to enter broadcast timer mode for an idle state that requires it, a new state is selected that does not require broadcast, but the broadcast variable remains set. This causes
tick_broadcast_exitto be called despite not having entered broadcast mode.
Quoted 7 lines
Quoted 5 lines
This causes the WARN_ON_ONCE(!irqs_disabled()) to trigger in some cases. It does not appear to cause problems for code today, but seems to violate the interface so should be fixed.
Signed-off-by Nicholas Piggin <[email protected]>Reviewed-by Thomas Gleixner <[email protected]>
Applied, thanks!