]> err.no Git - linux-2.6/commitdiff
sched: optimize effective_load()
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Fri, 27 Jun 2008 11:41:32 +0000 (13:41 +0200)
committerIngo Molnar <mingo@elte.hu>
Fri, 27 Jun 2008 12:31:43 +0000 (14:31 +0200)
s_i = S * rw_i / \Sum_j rw_j

 -> \Sum_j rw_j = S * rw_i / s_i

 -> s'_i = S * (rw_i + w) / (\Sum_j rw_j + w)

delta s = s' - s = S * (rw + w) / ((S * rw / s) + w)
        = s * (S * (rw + w) / (S * rw + s * w) - 1)

 a = S*(rw+w), b = S*rw + s*w

delta s = s * (a-b) / b

IOW, trade one divide for two multiplies

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Cc: Mike Galbraith <efault@gmx.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
kernel/sched_fair.c

index a1694441f8b71bca97f8129dec181bd79080d333..0d197be3e3e9dde796363d33da6a7f1c515f2bd8 100644 (file)
@@ -1082,16 +1082,16 @@ static unsigned long effective_load(struct task_group *tg, long wl, int cpu)
        for_each_sched_entity(se) {
 #define D(n) (likely(n) ? (n) : 1)
 
-               long S, Srw, rw, s, sn;
+               long S, rw, s, a, b;
 
                S = se->my_q->tg->shares;
                s = se->my_q->shares;
                rw = se->my_q->load.weight;
 
-               Srw = S * rw / D(s);
-               sn = S * (rw + wl) / D(Srw + wg);
+               a = S*(rw + wl);
+               b = S*rw + s*wg;
 
-               wl = sn - s;
+               wl = s*(a-b)/D(b);
                wg = 0;
 #undef D
        }