|
@@ -3,6 +3,7 @@
|
|
*/
|
|
*/
|
|
#include <linux/sched.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/cpu.h>
|
|
#include <linux/cpu.h>
|
|
|
|
+#include <linux/cpuidle.h>
|
|
#include <linux/tick.h>
|
|
#include <linux/tick.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/stackprotector.h>
|
|
#include <linux/stackprotector.h>
|
|
@@ -95,8 +96,10 @@ static void cpu_idle_loop(void)
|
|
if (!current_clr_polling_and_test()) {
|
|
if (!current_clr_polling_and_test()) {
|
|
stop_critical_timings();
|
|
stop_critical_timings();
|
|
rcu_idle_enter();
|
|
rcu_idle_enter();
|
|
- arch_cpu_idle();
|
|
|
|
- WARN_ON_ONCE(irqs_disabled());
|
|
|
|
|
|
+ if (cpuidle_idle_call())
|
|
|
|
+ arch_cpu_idle();
|
|
|
|
+ if (WARN_ON_ONCE(irqs_disabled()))
|
|
|
|
+ local_irq_enable();
|
|
rcu_idle_exit();
|
|
rcu_idle_exit();
|
|
start_critical_timings();
|
|
start_critical_timings();
|
|
} else {
|
|
} else {
|