| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Nicholas Piggin <npiggin@gmail.com> |
| Date: Fri, 1 Sep 2017 14:29:56 +1000 |
| Subject: cpuidle: fix broadcast control when broadcast can not be entered |
| |
| From: Nicholas Piggin <npiggin@gmail.com> |
| |
| |
| [ Upstream commit f187851b9b4a76952b1158b86434563dd2031103 ] |
| |
| 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. |
| |
| Signed-off-by: Nicholas Piggin <npiggin@gmail.com> |
| Reviewed-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/cpuidle/cpuidle.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| --- a/drivers/cpuidle/cpuidle.c |
| +++ b/drivers/cpuidle/cpuidle.c |
| @@ -189,6 +189,7 @@ int cpuidle_enter_state(struct cpuidle_d |
| return -EBUSY; |
| } |
| target_state = &drv->states[index]; |
| + broadcast = false; |
| } |
| |
| /* Take note of the planned idle state. */ |