aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-09-20 22:40:04 -0400
committerIngo Molnar <mingo@elte.hu>2010-09-21 07:57:12 -0400
commitb3bc211cfe7d5fe94b310480d78e00bea96fbf2a (patch)
treee968fb5c22fec33cc912cb40745583b4253703d6
parent43fa5460fe60dea5c610490a1d263415419c60f6 (diff)
sched: Give CPU bound RT tasks preference
If a high priority task is waking up on a CPU that is running a lower priority task that is bound to a CPU, see if we can move the high RT task to another CPU first. Note, if all other CPUs are running higher priority tasks than the CPU bounded current task, then it will be preempted regardless. Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Gregory Haskins <ghaskins@novell.com> LKML-Reference: <20100921024138.888922071@goodmis.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--kernel/sched_rt.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 6a02b38ab653..baef30f08405 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -971,7 +971,8 @@ select_task_rq_rt(struct rq *rq, struct task_struct *p, int sd_flag, int flags)
971 * For equal prio tasks, we just let the scheduler sort it out. 971 * For equal prio tasks, we just let the scheduler sort it out.
972 */ 972 */
973 if (unlikely(rt_task(rq->curr)) && 973 if (unlikely(rt_task(rq->curr)) &&
974 rq->curr->prio < p->prio && 974 (rq->curr->rt.nr_cpus_allowed < 2 ||
975 rq->curr->prio < p->prio) &&
975 (p->rt.nr_cpus_allowed > 1)) { 976 (p->rt.nr_cpus_allowed > 1)) {
976 int cpu = find_lowest_rq(p); 977 int cpu = find_lowest_rq(p);
977 978
@@ -1491,9 +1492,10 @@ static void task_woken_rt(struct rq *rq, struct task_struct *p)
1491 if (!task_running(rq, p) && 1492 if (!task_running(rq, p) &&
1492 !test_tsk_need_resched(rq->curr) && 1493 !test_tsk_need_resched(rq->curr) &&
1493 has_pushable_tasks(rq) && 1494 has_pushable_tasks(rq) &&
1495 p->rt.nr_cpus_allowed > 1 &&
1494 rt_task(rq->curr) && 1496 rt_task(rq->curr) &&
1495 rq->curr->prio < p->prio && 1497 (rq->curr->rt.nr_cpus_allowed < 2 ||
1496 p->rt.nr_cpus_allowed > 1) 1498 rq->curr->prio < p->prio))
1497 push_rt_tasks(rq); 1499 push_rt_tasks(rq);
1498} 1500}
1499 1501