]> err.no Git - linux-2.6/commitdiff
sched: hierarchical load vs affine wakeups
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Fri, 27 Jun 2008 11:41:27 +0000 (13:41 +0200)
committerIngo Molnar <mingo@elte.hu>
Fri, 27 Jun 2008 12:31:40 +0000 (14:31 +0200)
With hierarchical grouping we can't just compare task weight to rq weight - we
need to scale the weight appropriately.

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 7b8d664d6f221c512a5f14ab35ae22deee735b91..865cb53a7ccf1776c0abcdc86438c2a84a1ac930 100644 (file)
@@ -1073,6 +1073,25 @@ static inline int wake_idle(int cpu, struct task_struct *p)
 
 static const struct sched_class fair_sched_class;
 
+#ifdef CONFIG_FAIR_GROUP_SCHED
+static unsigned long task_h_load(struct task_struct *p)
+{
+       unsigned long h_load = p->se.load.weight;
+       struct cfs_rq *cfs_rq = cfs_rq_of(&p->se);
+
+       update_h_load(task_cpu(p));
+
+       h_load = calc_delta_mine(h_load, cfs_rq->h_load, &cfs_rq->load);
+
+       return h_load;
+}
+#else
+static unsigned long task_h_load(struct task_struct *p)
+{
+       return p->se.load.weight;
+}
+#endif
+
 static int
 wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
            struct task_struct *p, int prev_cpu, int this_cpu, int sync,
@@ -1093,9 +1112,9 @@ wake_affine(struct rq *rq, struct sched_domain *this_sd, struct rq *this_rq,
         * of the current CPU:
         */
        if (sync)
-               tl -= current->se.load.weight;
+               tl -= task_h_load(current);
 
-       balanced = 100*(tl + p->se.load.weight) <= imbalance*load;
+       balanced = 100*(tl + task_h_load(p)) <= imbalance*load;
 
        /*
         * If the currently running task will sleep within