aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
authorSiddha, Suresh B <suresh.b.siddha@intel.com>2007-05-08 03:33:01 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-08 14:15:17 -0400
commit4953198b6ce07b008b0f1c2edd41c9d027a118b4 (patch)
treedc0f500aae58c84ee7d422ac11990956ecbf9673 /kernel/sched.c
parent5517d86bea237c1d7078840182d9ebc0fe4c1afc (diff)
sched: optimize siblings status check logic in wake_idle()
When a logical cpu 'x' already has more than one process running, then most likely the siblings of that cpu 'x' must be busy. Otherwise the idle siblings would have likely(in most of the scenarios) picked up the extra load making the load on 'x' atmost one. Use this logic to eliminate the siblings status check and minimize the cache misses encountered on a heavily loaded system. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Acked-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index e4a5888549a5..e60786eb731c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1406,7 +1406,16 @@ static int wake_idle(int cpu, struct task_struct *p)
1406 struct sched_domain *sd; 1406 struct sched_domain *sd;
1407 int i; 1407 int i;
1408 1408
1409 if (idle_cpu(cpu)) 1409 /*
1410 * If it is idle, then it is the best cpu to run this task.
1411 *
1412 * This cpu is also the best, if it has more than one task already.
1413 * Siblings must be also busy(in most cases) as they didn't already
1414 * pickup the extra load from this cpu and hence we need not check
1415 * sibling runqueue info. This will avoid the checks and cache miss
1416 * penalities associated with that.
1417 */
1418 if (idle_cpu(cpu) || cpu_rq(cpu)->nr_running > 1)
1410 return cpu; 1419 return cpu;
1411 1420
1412 for_each_domain(cpu, sd) { 1421 for_each_domain(cpu, sd) {