clockevents: Don't allow dummy broadcast timers
Currently tick_check_broadcast_device doesn't reject clock_event_devices with CLOCK_EVT_FEAT_DUMMY, and may select them in preference to real hardware if they have a higher rating value. In this situation, the dummy timer is responsible for broadcasting to itself, and the core clockevents code may attempt to call non-existent callbacks for programming the dummy, eventually leading to a panic. This patch makes tick_check_broadcast_device always reject dummy timers, preventing this problem. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: linux-arm-kernel@lists.infradead.org Cc: Jon Medhurst (Tixy) <tixy@linaro.org> Cc: stable@vger.kernel.org Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
6dbe51c251
commit
a7dc19b865
1 changed files with 2 additions and 1 deletions
|
@ -67,7 +67,8 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc)
|
||||||
*/
|
*/
|
||||||
int tick_check_broadcast_device(struct clock_event_device *dev)
|
int tick_check_broadcast_device(struct clock_event_device *dev)
|
||||||
{
|
{
|
||||||
if ((tick_broadcast_device.evtdev &&
|
if ((dev->features & CLOCK_EVT_FEAT_DUMMY) ||
|
||||||
|
(tick_broadcast_device.evtdev &&
|
||||||
tick_broadcast_device.evtdev->rating >= dev->rating) ||
|
tick_broadcast_device.evtdev->rating >= dev->rating) ||
|
||||||
(dev->features & CLOCK_EVT_FEAT_C3STOP))
|
(dev->features & CLOCK_EVT_FEAT_C3STOP))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue