diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 0b8ab121e..2c1c63bdd 100755 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -10944,6 +10944,14 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) return pulled_task; update_misfit_status(NULL, this_rq); + + /* + * There is a task waiting to run. No need to search for one. + * Return 0; the task will be enqueued when switching to idle. + */ + if (this_rq->ttwu_pending) + return 0; + /* * We must set idle_stamp _before_ calling idle_balance(), such that we * measure the duration of idle_balance() as idle time. @@ -11009,7 +11017,8 @@ static int newidle_balance(struct rq *this_rq, struct rq_flags *rf) * Stop searching for tasks to pull if there are * now runnable tasks on this rq. */ - if (pulled_task || this_rq->nr_running > 0) + if (pulled_task || this_rq->nr_running > 0 || + this_rq->ttwu_pending) break; } rcu_read_unlock();