summaryrefslogtreecommitdiff
path: root/kernel/sched/idle.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/idle.c')
-rw-r--r--kernel/sched/idle.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index f65ef1e2f204..e0aa6c73a5fa 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -225,6 +225,8 @@ exit_idle:
static void do_idle(void)
{
int cpu = smp_processor_id();
+ bool pending = false;
+
/*
* If the arch has a polling bit, we maintain an invariant:
*
@@ -235,7 +237,10 @@ static void do_idle(void)
*/
__current_set_polling();
- tick_nohz_idle_enter();
+ if (unlikely(softirq_pending(cpu)))
+ pending = true;
+ else
+ tick_nohz_idle_enter();
while (!need_resched()) {
rmb();
@@ -273,7 +278,8 @@ static void do_idle(void)
* an IPI to fold the state for us.
*/
preempt_set_need_resched();
- tick_nohz_idle_exit();
+ if (!pending)
+ tick_nohz_idle_exit();
__current_clr_polling();
/*
@@ -355,6 +361,7 @@ void cpu_startup_entry(enum cpuhp_state state)
do_idle();
}
+#ifndef CONFIG_SCHED_MUQSS
/*
* idle-task scheduling class.
*/
@@ -479,3 +486,4 @@ const struct sched_class idle_sched_class = {
.switched_to = switched_to_idle,
.update_curr = update_curr_idle,
};
+#endif /* CONFIG_SCHED_MUQSS */