linux/drivers/cpuidle
Rafael J. Wysocki df8d9eeadd cpuidle: Run tick_broadcast_exit() with disabled interrupts
Commit 335f49196f (sched/idle: Use explicit broadcast oneshot
control function) replaced clockevents_notify() invocations in
cpuidle_idle_call() with direct calls to tick_broadcast_enter()
and tick_broadcast_exit(), but it overlooked the fact that
interrupts were already enabled before calling the latter which
led to functional breakage on systems using idle states with the
CPUIDLE_FLAG_TIMER_STOP flag set.

Fix that by moving the invocations of tick_broadcast_enter()
and tick_broadcast_exit() down into cpuidle_enter_state() where
interrupts are still disabled when tick_broadcast_exit() is
called.  Also ensure that interrupts will be disabled before
running tick_broadcast_exit() even if they have been enabled by
the idle state's ->enter callback.  Trigger a WARN_ON_ONCE() in
that case, as we generally don't want that to happen for states
with CPUIDLE_FLAG_TIMER_STOP set.

Fixes: 335f49196f (sched/idle: Use explicit broadcast oneshot control function)
Reported-and-tested-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reported-and-tested-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-04-29 15:19:21 +02:00
..
governors cpuidle: menu: use DIV_ROUND_CLOSEST_ULL() 2015-04-17 09:03:55 -04:00
coupled.c drivers: fix up obsolete cpu function usage. 2015-03-05 13:37:02 +10:30
cpuidle-arm.c ARM: cpuidle: Register per cpuidle device 2015-03-24 14:46:25 +01:00
cpuidle-at91.c ARM: cpuidle: Remove duplicate header inclusion 2015-03-23 18:03:11 +01:00
cpuidle-big_little.c
cpuidle-calxeda.c
cpuidle-clps711x.c
cpuidle-cps.c
cpuidle-exynos.c ARM: SoC fixes for v4.1 2015-04-22 09:03:30 -07:00
cpuidle-kirkwood.c ARM: cpuidle: Remove duplicate header inclusion 2015-03-23 18:03:11 +01:00
cpuidle-mvebu-v7.c cpuidle: mvebu: Update cpuidle thresholds for Armada XP SOCs 2015-03-13 18:31:29 +01:00
cpuidle-powernv.c
cpuidle-pseries.c
cpuidle-ux500.c ARM: cpuidle: Remove duplicate header inclusion 2015-03-23 18:03:11 +01:00
cpuidle-zynq.c ARM: cpuidle: Remove duplicate header inclusion 2015-03-23 18:03:11 +01:00
cpuidle.c cpuidle: Run tick_broadcast_exit() with disabled interrupts 2015-04-29 15:19:21 +02:00
cpuidle.h
driver.c cpuidle: Use explicit broadcast control function 2015-04-03 08:44:32 +02:00
dt_idle_states.c
dt_idle_states.h
governor.c
Kconfig ARM: cpuidle: Enable the ARM64 driver for both ARM32/ARM64 2015-03-24 10:16:11 +01:00
Kconfig.arm ARM: cpuidle: Enable the ARM64 driver for both ARM32/ARM64 2015-03-24 10:16:11 +01:00
Kconfig.mips
Kconfig.powerpc
Makefile ARM: cpuidle: Enable the ARM64 driver for both ARM32/ARM64 2015-03-24 10:16:11 +01:00
sysfs.c cpuidle: remove state_count field from struct cpuidle_device 2015-04-03 13:15:50 +02:00