46 lines
1.7 KiB
Diff
46 lines
1.7 KiB
Diff
From ea9d8e3f45404d411c00ae67b45cc35c58265bb7 Mon Sep 17 00:00:00 2001
|
|
From: Xiaotian Feng <dfeng@redhat.com>
|
|
Date: Thu, 7 Jan 2010 11:22:44 +0800
|
|
Subject: [PATCH] clockevent: Don't remove broadcast device when cpu is dead
|
|
|
|
Marc reported that the BUG_ON in clockevents_notify() triggers on his
|
|
system. This happens because the kernel tries to remove an active
|
|
clock event device (used for broadcasting) from the device list.
|
|
|
|
The handling of devices which can be used as per cpu device and as a
|
|
global broadcast device is suboptimal.
|
|
|
|
The simplest solution for now (and for stable) is to check whether the
|
|
device is used as global broadcast device, but this needs to be
|
|
revisited.
|
|
|
|
[ tglx: restored the cpuweight check and massaged the changelog ]
|
|
|
|
Reported-by: Marc Dionne <marc.c.dionne@gmail.com>
|
|
Tested-by: Marc Dionne <marc.c.dionne@gmail.com>
|
|
Signed-off-by: Xiaotian Feng <dfeng@redhat.com>
|
|
LKML-Reference: <1262834564-13033-1-git-send-email-dfeng@redhat.com>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Cc: stable@kernel.org
|
|
---
|
|
kernel/time/clockevents.c | 3 ++-
|
|
1 files changed, 2 insertions(+), 1 deletions(-)
|
|
|
|
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
|
|
index 6f740d9..d7395fd 100644
|
|
--- a/kernel/time/clockevents.c
|
|
+++ b/kernel/time/clockevents.c
|
|
@@ -259,7 +259,8 @@ void clockevents_notify(unsigned long reason, void *arg)
|
|
cpu = *((int *)arg);
|
|
list_for_each_entry_safe(dev, tmp, &clockevent_devices, list) {
|
|
if (cpumask_test_cpu(cpu, dev->cpumask) &&
|
|
- cpumask_weight(dev->cpumask) == 1) {
|
|
+ cpumask_weight(dev->cpumask) == 1 &&
|
|
+ !tick_is_broadcast_device(dev)) {
|
|
BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
|
|
list_del(&dev->list);
|
|
}
|
|
--
|
|
1.6.6
|
|
|