diff --git a/kernel/sched/core.c b/kernel/sched/core.c index ab9f6ac099a713..80f708e6b52973 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3502,6 +3502,13 @@ asmlinkage __visible void __sched schedule(void) } EXPORT_SYMBOL(schedule); +void __sched schedule_idle(void) +{ + do { + __schedule(false); + } while (need_resched()); +} + #ifdef CONFIG_CONTEXT_TRACKING asmlinkage __visible void __sched schedule_user(void) { diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index ac6d5176463dca..229c17e025f6b1 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -264,7 +264,7 @@ static void do_idle(void) smp_mb__after_atomic(); sched_ttwu_pending(); - schedule_preempt_disabled(); + schedule_idle(); } bool cpu_in_idle(unsigned long pc) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index de4b934ba9743d..c01c99fbe95ca6 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1467,6 +1467,8 @@ static inline struct cpuidle_state *idle_get_state(struct rq *rq) } #endif +extern void schedule_idle(void); + extern void sysrq_sched_debug_show(void); extern void sched_init_granularity(void); extern void update_max_interval(void);