diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2012-03-01 13:55:28 -0500 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-04-10 16:41:05 -0500 |
commit | 4dafbbbb3025e8e9a73c6645a92b829e97af5961 (patch) | |
tree | 7a6d3c99d7d93497322b1c35c4c3ce453b2d6500 /kernel/timer.c | |
parent | 3d3c97d9fd79ab7ef8ab2d9eb7137115bcaf57d1 (diff) |
timer: Fix hotplug for -rt
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>
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 935f46dffbb5..5413ff6f98c8 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -1793,21 +1793,17 @@ 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)); 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); @@ -1821,10 +1817,8 @@ static void __cpuinit migrate_timers(int cpu) } 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 */ |