|
@@ -2579,18 +2579,11 @@ static inline void schedule_debug(struct task_struct *prev)
|
|
|
schedstat_inc(this_rq(), sched_count);
|
|
|
}
|
|
|
|
|
|
-static void put_prev_task(struct rq *rq, struct task_struct *prev)
|
|
|
-{
|
|
|
- if (prev->on_rq || rq->skip_clock_update < 0)
|
|
|
- update_rq_clock(rq);
|
|
|
- prev->sched_class->put_prev_task(rq, prev);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Pick up the highest-prio task:
|
|
|
*/
|
|
|
static inline struct task_struct *
|
|
|
-pick_next_task(struct rq *rq)
|
|
|
+pick_next_task(struct rq *rq, struct task_struct *prev)
|
|
|
{
|
|
|
const struct sched_class *class;
|
|
|
struct task_struct *p;
|
|
@@ -2600,13 +2593,13 @@ pick_next_task(struct rq *rq)
|
|
|
* the fair class we can call that function directly:
|
|
|
*/
|
|
|
if (likely(rq->nr_running == rq->cfs.h_nr_running)) {
|
|
|
- p = fair_sched_class.pick_next_task(rq);
|
|
|
+ p = fair_sched_class.pick_next_task(rq, prev);
|
|
|
if (likely(p))
|
|
|
return p;
|
|
|
}
|
|
|
|
|
|
for_each_class(class) {
|
|
|
- p = class->pick_next_task(rq);
|
|
|
+ p = class->pick_next_task(rq, prev);
|
|
|
if (p)
|
|
|
return p;
|
|
|
}
|
|
@@ -2714,8 +2707,10 @@ need_resched:
|
|
|
rq->idle_stamp = 0;
|
|
|
}
|
|
|
|
|
|
- put_prev_task(rq, prev);
|
|
|
- next = pick_next_task(rq);
|
|
|
+ if (prev->on_rq || rq->skip_clock_update < 0)
|
|
|
+ update_rq_clock(rq);
|
|
|
+
|
|
|
+ next = pick_next_task(rq, prev);
|
|
|
clear_tsk_need_resched(prev);
|
|
|
clear_preempt_need_resched();
|
|
|
rq->skip_clock_update = 0;
|
|
@@ -4748,7 +4743,7 @@ static void migrate_tasks(unsigned int dead_cpu)
|
|
|
if (rq->nr_running == 1)
|
|
|
break;
|
|
|
|
|
|
- next = pick_next_task(rq);
|
|
|
+ next = pick_next_task(rq, NULL);
|
|
|
BUG_ON(!next);
|
|
|
next->sched_class->put_prev_task(rq, next);
|
|
|
|