| From f8e2ce0f659f73ebfd712396048411a19398d324 Mon Sep 17 00:00:00 2001 |
| From: Mark Rutland <mark.rutland@arm.com> |
| Date: Thu, 7 Mar 2013 15:09:24 +0000 |
| Subject: [PATCH] clockevents: Don't allow dummy broadcast timers |
| |
| commit a7dc19b8652c862d5b7c4d2339bd3c428bd29c4a upstream. |
| |
| 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> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| kernel/time/tick-broadcast.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c |
| index 521987f85874..ab16ee785b7f 100644 |
| --- a/kernel/time/tick-broadcast.c |
| +++ b/kernel/time/tick-broadcast.c |
| @@ -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) |
| { |
| - if ((tick_broadcast_device.evtdev && |
| + if ((dev->features & CLOCK_EVT_FEAT_DUMMY) || |
| + (tick_broadcast_device.evtdev && |
| tick_broadcast_device.evtdev->rating >= dev->rating) || |
| (dev->features & CLOCK_EVT_FEAT_C3STOP)) |
| return 0; |
| -- |
| 1.8.5.2 |
| |