|
@@ -105,14 +105,17 @@ static void cpu_idle_loop(void)
|
|
|
__current_set_polling();
|
|
|
}
|
|
|
arch_cpu_idle_exit();
|
|
|
- /*
|
|
|
- * We need to test and propagate the TIF_NEED_RESCHED
|
|
|
- * bit here because we might not have send the
|
|
|
- * reschedule IPI to idle tasks.
|
|
|
- */
|
|
|
- if (tif_need_resched())
|
|
|
- set_preempt_need_resched();
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Since we fell out of the loop above, we know
|
|
|
+ * TIF_NEED_RESCHED must be set, propagate it into
|
|
|
+ * PREEMPT_NEED_RESCHED.
|
|
|
+ *
|
|
|
+ * This is required because for polling idle loops we will
|
|
|
+ * not have had an IPI to fold the state for us.
|
|
|
+ */
|
|
|
+ preempt_set_need_resched();
|
|
|
tick_nohz_idle_exit();
|
|
|
schedule_preempt_disabled();
|
|
|
}
|