@@ -121,7 +121,7 @@ void cpu_idle(void)
/* endless idle loop with no priority at all */
while (1) {
- tick_nohz_idle_enter_norcu();
+ tick_nohz_idle_enter();
while (!need_resched()) {
rmb();
@@ -137,8 +137,14 @@ void cpu_idle(void)
enter_idle();
/* Don't trace irqs off for idle */
stop_critical_timings();
+
+ /* enter_idle() needs rcu for notifiers */
+ rcu_idle_enter();
+
if (cpuidle_idle_call())
pm_idle();
+
+ rcu_idle_exit();
start_critical_timings();
/* In many cases the interrupt that ended idle
@@ -147,7 +153,7 @@ void cpu_idle(void)
__exit_idle();
}
- tick_nohz_idle_exit_norcu();
+ tick_nohz_idle_exit();
preempt_enable_no_resched();
schedule();
preempt_disable();