From: Quentin Perret <quentin.per...@arm.com>

[ Upstream commit 011b27bb5d3139e8b5fe9ceff1fc7f6dc3145071 ]

Add another member to the family of per-cpu sched_domain shortcut
pointers. This one, sd_asym_cpucapacity, points to the lowest level
at which the SD_ASYM_CPUCAPACITY flag is set. While at it, rename the
sd_asym shortcut to sd_asym_packing to avoid confusions.

Generally speaking, the largest opportunity to save energy via
scheduling comes from a smarter exploitation of heterogeneous platforms
(i.e. big.LITTLE). Consequently, the sd_asym_cpucapacity shortcut will
be used at first as the lowest domain where Energy-Aware Scheduling
(EAS) should be applied. For example, it is possible to apply EAS within
a socket on a multi-socket system, as long as each socket has an
asymmetric topology. Energy-aware cross-sockets wake-up balancing will
only happen when the system is over-utilized, or this_cpu and prev_cpu
are in different sockets.

Suggested-by: Morten Rasmussen <morten.rasmus...@arm.com>
Signed-off-by: Quentin Perret <quentin.per...@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <pet...@infradead.org>
Cc: Linus Torvalds <torva...@linux-foundation.org>
Cc: Mike Galbraith <efa...@gmx.de>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: adhar...@codeaurora.org
Cc: chris.redp...@arm.com
Cc: curroje...@riseup.net
Cc: dietmar.eggem...@arm.com
Cc: edubez...@gmail.com
Cc: gre...@linuxfoundation.org
Cc: javi.mer...@kernel.org
Cc: j...@joelfernandes.org
Cc: juri.le...@redhat.com
Cc: patrick.bell...@arm.com
Cc: pkond...@codeaurora.org
Cc: r...@rjwysocki.net
Cc: skan...@codeaurora.org
Cc: smuc...@google.com
Cc: srinivas.pandruv...@linux.intel.com
Cc: thara.gopin...@linaro.org
Cc: tk...@google.com
Cc: valentin.schnei...@arm.com
Cc: vincent.guit...@linaro.org
Cc: viresh.ku...@linaro.org
Link: https://lkml.kernel.org/r/20181203095628.11858-7-quentin.per...@arm.com
Signed-off-by: Ingo Molnar <mi...@kernel.org>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 kernel/sched/fair.c     | 2 +-
 kernel/sched/sched.h    | 3 ++-
 kernel/sched/topology.c | 8 ++++++--
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index e8f191ba3fe5..9ef0b878229d 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9256,7 +9256,7 @@ static void nohz_balancer_kick(struct rq *rq)
                }
        }
 
-       sd = rcu_dereference(per_cpu(sd_asym, cpu));
+       sd = rcu_dereference(per_cpu(sd_asym_packing, cpu));
        if (sd) {
                for_each_cpu(i, sched_domain_span(sd)) {
                        if (i == cpu ||
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 4e524ab589c9..6f68dcb791f6 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1285,7 +1285,8 @@ DECLARE_PER_CPU(int, sd_llc_size);
 DECLARE_PER_CPU(int, sd_llc_id);
 DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
 DECLARE_PER_CPU(struct sched_domain *, sd_numa);
-DECLARE_PER_CPU(struct sched_domain *, sd_asym);
+DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing);
+DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
 extern struct static_key_false sched_asym_cpucapacity;
 
 struct sched_group_capacity {
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
index 8d7f15ba5916..ced83d060ec8 100644
--- a/kernel/sched/topology.c
+++ b/kernel/sched/topology.c
@@ -397,7 +397,8 @@ DEFINE_PER_CPU(int, sd_llc_size);
 DEFINE_PER_CPU(int, sd_llc_id);
 DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared);
 DEFINE_PER_CPU(struct sched_domain *, sd_numa);
-DEFINE_PER_CPU(struct sched_domain *, sd_asym);
+DEFINE_PER_CPU(struct sched_domain *, sd_asym_packing);
+DEFINE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity);
 DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity);
 
 static void update_top_cache_domain(int cpu)
@@ -423,7 +424,10 @@ static void update_top_cache_domain(int cpu)
        rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
 
        sd = highest_flag_domain(cpu, SD_ASYM_PACKING);
-       rcu_assign_pointer(per_cpu(sd_asym, cpu), sd);
+       rcu_assign_pointer(per_cpu(sd_asym_packing, cpu), sd);
+
+       sd = lowest_flag_domain(cpu, SD_ASYM_CPUCAPACITY);
+       rcu_assign_pointer(per_cpu(sd_asym_cpucapacity, cpu), sd);
 }
 
 /*
-- 
2.19.1

Reply via email to