Skip to contentSkip to conversation

cpuidle: fix broadcast control when broadcast can not be entered

PATCH Applied Nicholas Piggin 3 participants 3 messages Sep 1, 2017 – Oct 3, 2017 CPU idle time management framework

lore
Share & tools
lore
#0 lore raw

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
index 60bb64f4329d..4453e27f855e 100644
@@ -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
Reviewed-by on v1 1/1
#1 lore raw
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_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.

Quoted 20 lines
---
 drivers/cpuidle/cpuidle.c | 1 +
 1 file changed, 1 insertion(+)
drivers/cpuidle/cpuidle.c +1 -0
index 60bb64f4329d..4453e27f855e 100644
@@ -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
maintainer Applied
#2 lore raw
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_exit to 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.

Applied, thanks!