Thread (79 messages) 79 messages, 8 authors, 2014-09-18

[PATCH v5 08/12] sched: move cfs task on a CPU with higher capacity

From: vincent.guittot@linaro.org (Vincent Guittot)
Date: 2014-09-11 12:15:15
Also in: lkml

On 11 September 2014 12:13, Peter Zijlstra [off-list ref] wrote:
On Tue, Aug 26, 2014 at 01:06:51PM +0200, Vincent Guittot wrote:
quoted
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 18db43e..60ae1ce 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6049,6 +6049,14 @@ static bool update_sd_pick_busiest(struct lb_env *env,
                      return true;
      }

+     /*
+      * The group capacity is reduced probably because of activity from other
+      * sched class or interrupts which use part of the available capacity
+      */
+     if ((sg->sgc->capacity_orig * 100) > (sgs->group_capacity *
+                             env->sd->imbalance_pct))
+             return true;
+
      return false;
 }
@@ -6534,13 +6542,23 @@ static int need_active_balance(struct lb_env *env)
      struct sched_domain *sd = env->sd;

      if (env->idle == CPU_NEWLY_IDLE) {
+             int src_cpu = env->src_cpu;

              /*
               * ASYM_PACKING needs to force migrate tasks from busy but
               * higher numbered CPUs in order to pack all tasks in the
               * lowest numbered CPUs.
               */
-             if ((sd->flags & SD_ASYM_PACKING) && env->src_cpu > env->dst_cpu)
+             if ((sd->flags & SD_ASYM_PACKING) && src_cpu > env->dst_cpu)
+                     return 1;
+
+             /*
+              * If the CPUs share their cache and the src_cpu's capacity is
+              * reduced because of other sched_class or IRQs, we trig an
+              * active balance to move the task
+              */
+             if ((capacity_orig_of(src_cpu) * 100) > (capacity_of(src_cpu) *
+                             sd->imbalance_pct))
                      return 1;
      }
Should you not also check -- in both cases -- that the destination is
any better?
The case should have been solved earlier when calculating the
imbalance which should be null if the destination is worse than the
source.

But i haven't formally check that calculate_imbalance correctly
handles that case
Also, there's some obvious repetition going on there, maybe add a
helper?
yes
Also, both sites should probably ensure they're operating in the
non-saturated/overloaded scenario. Because as soon as we're completely
saturated we want SMP nice etc. and that all already works right
(presumably).
If both are overloaded, calculated_imbalance will cap the max load
that can be pulled so the busiest_group will not become idle
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help