|
@@ -1620,9 +1620,11 @@ static void migrate_hrtimers(int cpu)
|
|
|
new_base = &get_cpu_var(hrtimer_bases);
|
|
|
|
|
|
tick_cancel_sched_timer(cpu);
|
|
|
-
|
|
|
- local_irq_disable();
|
|
|
- spin_lock(&new_base->lock);
|
|
|
+ /*
|
|
|
+ * 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);
|
|
|
|
|
|
for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
|
|
@@ -1631,8 +1633,7 @@ static void migrate_hrtimers(int cpu)
|
|
|
}
|
|
|
|
|
|
spin_unlock(&old_base->lock);
|
|
|
- spin_unlock(&new_base->lock);
|
|
|
- local_irq_enable();
|
|
|
+ spin_unlock_irq(&new_base->lock);
|
|
|
put_cpu_var(hrtimer_bases);
|
|
|
}
|
|
|
#endif /* CONFIG_HOTPLUG_CPU */
|