aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-06-16 21:55:22 -0400
committerIngo Molnar <mingo@elte.hu>2011-08-14 06:00:52 -0400
commitc37495fd0f64fc139b5a07d242bcb485174d1206 (patch)
tree0b60964cdb549e5e455d560aa4397102a666a617 /kernel
parent1812a643ccbfeb61a00a7f0d7219606e63d8815b (diff)
sched: Balance RT tasks when forked as well
When a new task is woken, the code to balance the RT task is currently skipped in the select_task_rq() call. But it will be pushed if the rq is currently overloaded with RT tasks anyway. The issue is that we already queued the task, and if it does get pushed, it will have to be dequeued and requeued on the new run queue. The advantage with pushing it first is that we avoid this requeuing as we are pushing it off before the task is ever queued. See commit 318e0893ce3f524 ("sched: pre-route RT tasks on wakeup") for more details. The return of select_task_rq() when it is not a wake up has also been changed to return task_cpu() instead of smp_processor_id(). This is more of a sanity because the current only other user of select_task_rq() besides wake ups, is an exec, where task_cpu() should also be the same as smp_processor_id(). But if it is used for other purposes, lets keep the task on the same CPU. Why would we mant to migrate it to the current CPU? Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Hillf Danton <dhillf@gmail.com> Link: http://lkml.kernel.org/r/20110617015919.832743148@goodmis.org Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched_rt.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
index 70107a39b1ba..2153a87e6157 100644
--- a/kernel/sched_rt.c
+++ b/kernel/sched_rt.c
@@ -1017,10 +1017,12 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags)
1017 struct rq *rq; 1017 struct rq *rq;
1018 int cpu; 1018 int cpu;
1019 1019
1020 if (sd_flag != SD_BALANCE_WAKE)
1021 return smp_processor_id();
1022
1023 cpu = task_cpu(p); 1020 cpu = task_cpu(p);
1021
1022 /* For anything but wake ups, just return the task_cpu */
1023 if (sd_flag != SD_BALANCE_WAKE && sd_flag != SD_BALANCE_FORK)
1024 goto out;
1025
1024 rq = cpu_rq(cpu); 1026 rq = cpu_rq(cpu);
1025 1027
1026 rcu_read_lock(); 1028 rcu_read_lock();
@@ -1059,6 +1061,7 @@ select_task_rq_rt(struct task_struct *p, int sd_flag, int flags)
1059 } 1061 }
1060 rcu_read_unlock(); 1062 rcu_read_unlock();
1061 1063
1064out:
1062 return cpu; 1065 return cpu;
1063} 1066}
1064 1067