diff options
author | Peter Zijlstra <peterz@infradead.org> | 2012-02-11 06:05:00 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-02-10 16:17:13 +0100 |
commit | 606dba2e289446600a0b68422ed2019af5355c12 (patch) | |
tree | 286562f6ddcca34f3f029b68507b820f0c81b707 /kernel/sched/rt.c | |
parent | sched/fair: Track cgroup depth (diff) | |
download | linux-606dba2e289446600a0b68422ed2019af5355c12.tar.xz linux-606dba2e289446600a0b68422ed2019af5355c12.zip |
sched: Push put_prev_task() into pick_next_task()
In order to avoid having to do put/set on a whole cgroup hierarchy
when we context switch, push the put into pick_next_task() so that
both operations are in the same function. Further changes then allow
us to possibly optimize away redundant work.
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1328936700.2476.17.camel@laptop
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/sched/rt.c')
-rw-r--r-- | kernel/sched/rt.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index a2740b775b45..a15ca1c0c7bf 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1310,15 +1310,7 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq) { struct sched_rt_entity *rt_se; struct task_struct *p; - struct rt_rq *rt_rq; - - rt_rq = &rq->rt; - - if (!rt_rq->rt_nr_running) - return NULL; - - if (rt_rq_throttled(rt_rq)) - return NULL; + struct rt_rq *rt_rq = &rq->rt; do { rt_se = pick_next_rt_entity(rq, rt_rq); @@ -1332,9 +1324,22 @@ static struct task_struct *_pick_next_task_rt(struct rq *rq) return p; } -static struct task_struct *pick_next_task_rt(struct rq *rq) +static struct task_struct * +pick_next_task_rt(struct rq *rq, struct task_struct *prev) { - struct task_struct *p = _pick_next_task_rt(rq); + struct task_struct *p; + struct rt_rq *rt_rq = &rq->rt; + + if (!rt_rq->rt_nr_running) + return NULL; + + if (rt_rq_throttled(rt_rq)) + return NULL; + + if (prev) + prev->sched_class->put_prev_task(rq, prev); + + p = _pick_next_task_rt(rq); /* The running task is never eligible for pushing */ if (p) |