diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2008-06-27 07:41:29 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-06-27 08:31:41 -0400 |
commit | 42a3ac7d5cee89849448b41b86faeb86f98e92f6 (patch) | |
tree | a601a02fd090b6da93b81ef9857133b8de7b5079 /kernel/sched_fair.c | |
parent | 408ed066b11cf9ee4536573b4269ee3613bd735e (diff) |
sched: fix load scaling in group balancing
doing the load balance will change cfs_rq->load.weight (that's the whole point)
but since that's part of the scale factor, we'll scale back with a different
amount.
Weight getting smaller would result in an inflated moved_load which causes
it to stop balancing too soon.
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
Cc: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Cc: Mike Galbraith <efault@gmx.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r-- | kernel/sched_fair.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 865cb53a7ccf..734e4c556fcb 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -1444,6 +1444,8 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
1444 | 1444 | ||
1445 | list_for_each_entry(tg, &task_groups, list) { | 1445 | list_for_each_entry(tg, &task_groups, list) { |
1446 | struct cfs_rq *busiest_cfs_rq = tg->cfs_rq[busiest_cpu]; | 1446 | struct cfs_rq *busiest_cfs_rq = tg->cfs_rq[busiest_cpu]; |
1447 | unsigned long busiest_h_load = busiest_cfs_rq->h_load; | ||
1448 | unsigned long busiest_weight = busiest_cfs_rq->load.weight; | ||
1447 | long rem_load, moved_load; | 1449 | long rem_load, moved_load; |
1448 | 1450 | ||
1449 | /* | 1451 | /* |
@@ -1452,8 +1454,8 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
1452 | if (!busiest_cfs_rq->task_weight) | 1454 | if (!busiest_cfs_rq->task_weight) |
1453 | continue; | 1455 | continue; |
1454 | 1456 | ||
1455 | rem_load = rem_load_move * busiest_cfs_rq->load.weight; | 1457 | rem_load = rem_load_move * busiest_weight; |
1456 | rem_load /= busiest_cfs_rq->h_load + 1; | 1458 | rem_load /= busiest_h_load + 1; |
1457 | 1459 | ||
1458 | moved_load = __load_balance_fair(this_rq, this_cpu, busiest, | 1460 | moved_load = __load_balance_fair(this_rq, this_cpu, busiest, |
1459 | rem_load, sd, idle, all_pinned, this_best_prio, | 1461 | rem_load, sd, idle, all_pinned, this_best_prio, |
@@ -1462,8 +1464,8 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
1462 | if (!moved_load) | 1464 | if (!moved_load) |
1463 | continue; | 1465 | continue; |
1464 | 1466 | ||
1465 | moved_load *= busiest_cfs_rq->h_load; | 1467 | moved_load *= busiest_h_load; |
1466 | moved_load /= busiest_cfs_rq->load.weight + 1; | 1468 | moved_load /= busiest_weight + 1; |
1467 | 1469 | ||
1468 | rem_load_move -= moved_load; | 1470 | rem_load_move -= moved_load; |
1469 | if (rem_load_move < 0) | 1471 | if (rem_load_move < 0) |