|
@@ -337,6 +337,19 @@ static inline void invoke_softirq(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static inline void tick_irq_exit(void)
|
|
|
+{
|
|
|
+#ifdef CONFIG_NO_HZ_COMMON
|
|
|
+ int cpu = smp_processor_id();
|
|
|
+
|
|
|
+ /* Make sure that timer wheel updates are propagated */
|
|
|
+ if ((idle_cpu(cpu) && !need_resched()) || tick_nohz_full_cpu(cpu)) {
|
|
|
+ if (!in_interrupt())
|
|
|
+ tick_nohz_irq_exit();
|
|
|
+ }
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Exit an interrupt context. Process softirqs if needed and possible:
|
|
|
*/
|
|
@@ -348,11 +361,7 @@ void irq_exit(void)
|
|
|
if (!in_interrupt() && local_softirq_pending())
|
|
|
invoke_softirq();
|
|
|
|
|
|
-#ifdef CONFIG_NO_HZ_COMMON
|
|
|
- /* Make sure that timer wheel updates are propagated */
|
|
|
- if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())
|
|
|
- tick_nohz_irq_exit();
|
|
|
-#endif
|
|
|
+ tick_irq_exit();
|
|
|
rcu_irq_exit();
|
|
|
sched_preempt_enable_no_resched();
|
|
|
}
|