diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2015-06-26 22:08:38 +0200 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2015-06-26 22:58:06 +0200 |
commit | 24bfcb100959c8641a627b5604d967243f8f240c (patch) | |
tree | 587b67fe9ad3ac465f698585e820ab677d749f64 | |
parent | 56a94f13919c0db5958611b388e1581b4852f3c9 (diff) | |
download | linux-stable-24bfcb100959c8641a627b5604d967243f8f240c.tar.gz linux-stable-24bfcb100959c8641a627b5604d967243f8f240c.tar.bz2 linux-stable-24bfcb100959c8641a627b5604d967243f8f240c.zip |
timer: Fix hotplug regression
The recent timer wheel rework removed the get/put_cpu_var() pair in
the hotplug migration code, which results in:
BUG: using smp_processor_id() in preemptible [00000000] code: hib.sh/2845
...
[<ffffffff810d4fa3>] timer_cpu_notify+0x53/0x12
That hunk is a leftover from an earlier iteration and went unnoticed
so far.
Restore the previous code which was obviously correct.
Fixes: 0eeda71bc30d 'timer: Replace timer base by a cpu index'
Reported-and_tested-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | kernel/time/timer.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 520499dd85af..5e097fa9faf7 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -1566,7 +1566,7 @@ static void migrate_timers(int cpu) BUG_ON(cpu_online(cpu)); old_base = per_cpu_ptr(&tvec_bases, cpu); - new_base = this_cpu_ptr(&tvec_bases); + new_base = get_cpu_ptr(&tvec_bases); /* * The caller is globally serialized and nobody else * takes two locks at once, deadlock is not possible. @@ -1590,6 +1590,7 @@ static void migrate_timers(int cpu) spin_unlock(&old_base->lock); spin_unlock_irq(&new_base->lock); + put_cpu_ptr(&tvec_bases); } static int timer_cpu_notify(struct notifier_block *self, |