sched: Fix sched-domain avg_load calculation
authorKen Chen <kenchen@google.com>
Fri, 8 Apr 2011 00:23:22 +0000 (17:23 -0700)
committerIngo Molnar <mingo@elte.hu>
Mon, 11 Apr 2011 09:08:54 +0000 (11:08 +0200)
commitb0432d8f162c7d5d9537b4cb749d44076b76a783
tree98b94ec55f6d18935aedbc9ab898705ad252b939
parent4263a2f1dad8c8e7ce2352a0cbc882c2b0c044a9
sched: Fix sched-domain avg_load calculation

In function find_busiest_group(), the sched-domain avg_load isn't
calculated at all if there is a group imbalance within the domain. This
will cause erroneous imbalance calculation.

The reason is that calculate_imbalance() sees sds->avg_load = 0 and it
will dump entire sds->max_load into imbalance variable, which is used
later on to migrate entire load from busiest CPU to the puller CPU.

This has two really bad effect:

1. stampede of task migration, and they won't be able to break out
   of the bad state because of positive feedback loop: large load
   delta -> heavier load migration -> larger imbalance and the cycle
   goes on.

2. severe imbalance in CPU queue depth.  This causes really long
   scheduling latency blip which affects badly on application that
   has tight latency requirement.

The fix is to have kernel calculate domain avg_load in both cases. This
will ensure that imbalance calculation is always sensible and the target
is usually half way between busiest and puller CPU.

Signed-off-by: Ken Chen <kenchen@google.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: <stable@kernel.org>
Link: http://lkml.kernel.org/r/20110408002322.3A0D812217F@elm.corp.google.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/sched_fair.c