aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched/fair.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/fair.c')
-rw-r--r--kernel/sched/fair.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index d8482e1c575e..b956e70fc503 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -4787,17 +4787,16 @@ simple:
return p;
idle:
+ new_tasks = idle_balance(rq);
/*
* Because idle_balance() releases (and re-acquires) rq->lock, it is
* possible for any higher priority task to appear. In that case we
* must re-start the pick_next_entity() loop.
*/
- new_tasks = idle_balance(rq);
-
- if (rq->nr_running != rq->cfs.h_nr_running)
+ if (new_tasks < 0)
return RETRY_TASK;
- if (new_tasks)
+ if (new_tasks > 0)
goto again;
return NULL;
@@ -6728,8 +6727,14 @@ static int idle_balance(struct rq *this_rq)
this_rq->max_idle_balance_cost = curr_cost;
out:
- if (pulled_task)
+ /* Is there a task of a high priority class? */
+ if (this_rq->nr_running != this_rq->cfs.h_nr_running)
+ pulled_task = -1;
+
+ if (pulled_task) {
+ idle_exit_fair(this_rq);
this_rq->idle_stamp = 0;
+ }
return pulled_task;
}