|
@@ -410,6 +410,22 @@ static void internal_add_timer(struct tvec_base *base, struct timer_list *timer)
|
|
base->next_timer = timer->expires;
|
|
base->next_timer = timer->expires;
|
|
}
|
|
}
|
|
base->all_timers++;
|
|
base->all_timers++;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Check whether the other CPU is in dynticks mode and needs
|
|
|
|
+ * to be triggered to reevaluate the timer wheel.
|
|
|
|
+ * We are protected against the other CPU fiddling
|
|
|
|
+ * with the timer by holding the timer base lock. This also
|
|
|
|
+ * makes sure that a CPU on the way to stop its tick can not
|
|
|
|
+ * evaluate the timer wheel.
|
|
|
|
+ *
|
|
|
|
+ * Spare the IPI for deferrable timers on idle targets though.
|
|
|
|
+ * The next busy ticks will take care of it. Except full dynticks
|
|
|
|
+ * require special care against races with idle_cpu(), lets deal
|
|
|
|
+ * with that later.
|
|
|
|
+ */
|
|
|
|
+ if (!tbase_get_deferrable(base) || tick_nohz_full_cpu(base->cpu))
|
|
|
|
+ wake_up_nohz_cpu(base->cpu);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_TIMER_STATS
|
|
#ifdef CONFIG_TIMER_STATS
|
|
@@ -949,22 +965,6 @@ void add_timer_on(struct timer_list *timer, int cpu)
|
|
timer_set_base(timer, base);
|
|
timer_set_base(timer, base);
|
|
debug_activate(timer, timer->expires);
|
|
debug_activate(timer, timer->expires);
|
|
internal_add_timer(base, timer);
|
|
internal_add_timer(base, timer);
|
|
- /*
|
|
|
|
- * Check whether the other CPU is in dynticks mode and needs
|
|
|
|
- * to be triggered to reevaluate the timer wheel.
|
|
|
|
- * We are protected against the other CPU fiddling
|
|
|
|
- * with the timer by holding the timer base lock. This also
|
|
|
|
- * makes sure that a CPU on the way to stop its tick can not
|
|
|
|
- * evaluate the timer wheel.
|
|
|
|
- *
|
|
|
|
- * Spare the IPI for deferrable timers on idle targets though.
|
|
|
|
- * The next busy ticks will take care of it. Except full dynticks
|
|
|
|
- * require special care against races with idle_cpu(), lets deal
|
|
|
|
- * with that later.
|
|
|
|
- */
|
|
|
|
- if (!tbase_get_deferrable(timer->base) || tick_nohz_full_cpu(cpu))
|
|
|
|
- wake_up_nohz_cpu(cpu);
|
|
|
|
-
|
|
|
|
spin_unlock_irqrestore(&base->lock, flags);
|
|
spin_unlock_irqrestore(&base->lock, flags);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(add_timer_on);
|
|
EXPORT_SYMBOL_GPL(add_timer_on);
|