52 lines
1.5 KiB
Diff
52 lines
1.5 KiB
Diff
From 58c6e543302c8cf9d7a56ad1f111da9f2346a94f Mon Sep 17 00:00:00 2001
|
|
From: Ingo Molnar <mingo@elte.hu>
|
|
Date: Fri, 3 Jul 2009 08:30:32 -0500
|
|
Subject: [PATCH 128/279] timers: fix timer hotplug on -rt
|
|
|
|
Here we are in the CPU_DEAD notifier, and we must not sleep nor
|
|
enable interrupts.
|
|
|
|
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
kernel/timer.c | 12 +++++++++---
|
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/kernel/timer.c b/kernel/timer.c
|
|
index 2aa1215..e36b343 100644
|
|
--- a/kernel/timer.c
|
|
+++ b/kernel/timer.c
|
|
@@ -1714,6 +1714,7 @@ static void __cpuinit migrate_timers(int cpu)
|
|
{
|
|
struct tvec_base *old_base;
|
|
struct tvec_base *new_base;
|
|
+ unsigned long flags;
|
|
int i;
|
|
|
|
BUG_ON(cpu_online(cpu));
|
|
@@ -1723,8 +1724,11 @@ static void __cpuinit migrate_timers(int cpu)
|
|
* The caller is globally serialized and nobody else
|
|
* takes two locks at once, deadlock is not possible.
|
|
*/
|
|
- spin_lock_irq(&new_base->lock);
|
|
- spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
|
|
+ local_irq_save(flags);
|
|
+ while (!spin_trylock(&new_base->lock))
|
|
+ cpu_relax();
|
|
+ while (!spin_trylock(&old_base->lock))
|
|
+ cpu_relax();
|
|
|
|
BUG_ON(old_base->running_timer);
|
|
|
|
@@ -1738,7 +1742,9 @@ static void __cpuinit migrate_timers(int cpu)
|
|
}
|
|
|
|
spin_unlock(&old_base->lock);
|
|
- spin_unlock_irq(&new_base->lock);
|
|
+ spin_unlock(&new_base->lock);
|
|
+ local_irq_restore(flags);
|
|
+
|
|
put_cpu_var(tvec_bases);
|
|
}
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|