]> err.no Git - linux-2.6/commitdiff
sched: dont micro manage share losses
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Fri, 27 Jun 2008 11:41:21 +0000 (13:41 +0200)
committerIngo Molnar <mingo@elte.hu>
Fri, 27 Jun 2008 12:31:34 +0000 (14:31 +0200)
We used to try and contain the loss of 'shares' by playing arithmetic
games. Replace that by noticing that at the top sched_domain we'll
always have the full weight in shares to distribute.

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.c

index dae20199dc9cb4d6bf1a2529a140630d9d3c856c..28229c5d498303604a2c9bb724ada4e5c65e05e9 100644 (file)
@@ -1551,6 +1551,9 @@ aggregate_group_shares(struct task_group *tg, int cpu, struct sched_domain *sd)
        if ((!shares && aggregate(tg, cpu)->rq_weight) || shares > tg->shares)
                shares = tg->shares;
 
+       if (!sd->parent || !(sd->parent->flags & SD_LOAD_BALANCE))
+               shares = tg->shares;
+
        aggregate(tg, cpu)->shares = shares;
 }
 
@@ -1642,20 +1645,8 @@ static void
 __move_group_shares(struct task_group *tg, int cpu, struct sched_domain *sd,
                    int scpu, int dcpu)
 {
-       unsigned long shares;
-
-       shares = tg->cfs_rq[scpu]->shares + tg->cfs_rq[dcpu]->shares;
-
        __update_group_shares_cpu(tg, cpu, sd, scpu);
        __update_group_shares_cpu(tg, cpu, sd, dcpu);
-
-       /*
-        * ensure we never loose shares due to rounding errors in the
-        * above redistribution.
-        */
-       shares -= tg->cfs_rq[scpu]->shares + tg->cfs_rq[dcpu]->shares;
-       if (shares)
-               tg->cfs_rq[dcpu]->shares += shares;
 }
 
 /*
@@ -1675,7 +1666,6 @@ move_group_shares(struct task_group *tg, int cpu, struct sched_domain *sd,
 static void
 aggregate_group_set_shares(struct task_group *tg, int cpu, struct sched_domain *sd)
 {
-       unsigned long shares = aggregate(tg, cpu)->shares;
        int i;
 
        for_each_cpu_mask(i, sd->span) {
@@ -1688,16 +1678,6 @@ aggregate_group_set_shares(struct task_group *tg, int cpu, struct sched_domain *
        }
 
        aggregate_group_shares(tg, cpu, sd);
-
-       /*
-        * ensure we never loose shares due to rounding errors in the
-        * above redistribution.
-        */
-       shares -= aggregate(tg, cpu)->shares;
-       if (shares) {
-               tg->cfs_rq[cpu]->shares += shares;
-               aggregate(tg, cpu)->shares += shares;
-       }
 }
 
 /*