2012-06-17 19:52:06 +00:00
|
|
|
From aca12531075a1411fc35e84a891a07a8736a1f7e Mon Sep 17 00:00:00 2001
|
2012-03-04 13:31:34 +00:00
|
|
|
From: Steven Rostedt <rostedt@goodmis.org>
|
2012-06-17 19:52:06 +00:00
|
|
|
Date: Thu, 1 Mar 2012 13:55:28 -0500
|
|
|
|
Subject: [235/254] timer: Fix hotplug for -rt
|
2012-03-04 13:31:34 +00:00
|
|
|
|
|
|
|
Revert the RT patch:
|
|
|
|
Author: Ingo Molnar <mingo@elte.hu>
|
|
|
|
Date: Fri Jul 3 08:30:32 2009 -0500
|
|
|
|
timers: fix timer hotplug on -rt
|
|
|
|
|
|
|
|
Here we are in the CPU_DEAD notifier, and we must not sleep nor
|
|
|
|
enable interrupts.
|
|
|
|
|
|
|
|
There's no problem with sleeping in this notifier.
|
|
|
|
|
|
|
|
But the get_cpu_var() had to be converted to a get_local_var().
|
|
|
|
|
|
|
|
Replace the previous fix with the get_local_var() convert.
|
|
|
|
|
|
|
|
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
|
|
|
|
Cc: Carsten Emde <C.Emde@osadl.org>
|
|
|
|
Cc: John Kacur <jkacur@redhat.com>
|
|
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
|
|
Cc: Clark Williams <clark.williams@gmail.com>
|
|
|
|
Cc: stable-rt@vger.kernel.org
|
|
|
|
Link: http://lkml.kernel.org/r/20120301190344.948157137@goodmis.org
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
|
|
---
|
|
|
|
kernel/timer.c | 16 +++++-----------
|
|
|
|
1 file changed, 5 insertions(+), 11 deletions(-)
|
|
|
|
|
2012-06-17 19:52:06 +00:00
|
|
|
diff --git a/kernel/timer.c b/kernel/timer.c
|
|
|
|
index 935f46d..5413ff6 100644
|
|
|
|
--- a/kernel/timer.c
|
|
|
|
+++ b/kernel/timer.c
|
|
|
|
@@ -1793,21 +1793,17 @@ static void __cpuinit migrate_timers(int cpu)
|
2012-03-04 13:31:34 +00:00
|
|
|
{
|
|
|
|
struct tvec_base *old_base;
|
|
|
|
struct tvec_base *new_base;
|
|
|
|
- unsigned long flags;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
BUG_ON(cpu_online(cpu));
|
|
|
|
old_base = per_cpu(tvec_bases, cpu);
|
|
|
|
- new_base = get_cpu_var(tvec_bases);
|
|
|
|
+ new_base = get_local_var(tvec_bases);
|
|
|
|
/*
|
|
|
|
* The caller is globally serialized and nobody else
|
|
|
|
* takes two locks at once, deadlock is not possible.
|
|
|
|
*/
|
|
|
|
- local_irq_save(flags);
|
|
|
|
- while (!spin_trylock(&new_base->lock))
|
|
|
|
- cpu_relax();
|
|
|
|
- while (!spin_trylock(&old_base->lock))
|
|
|
|
- cpu_relax();
|
|
|
|
+ spin_lock_irq(&new_base->lock);
|
|
|
|
+ spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);
|
|
|
|
|
|
|
|
BUG_ON(old_base->running_timer);
|
|
|
|
|
2012-06-17 19:52:06 +00:00
|
|
|
@@ -1821,10 +1817,8 @@ static void __cpuinit migrate_timers(int cpu)
|
2012-03-04 13:31:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
spin_unlock(&old_base->lock);
|
|
|
|
- spin_unlock(&new_base->lock);
|
|
|
|
- local_irq_restore(flags);
|
|
|
|
-
|
|
|
|
- put_cpu_var(tvec_bases);
|
|
|
|
+ spin_unlock_irq(&new_base->lock);
|
|
|
|
+ put_local_var(tvec_bases);
|
|
|
|
}
|
|
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|
|
|
|
|