diff mbox

[v2,04/13] sched: Introduce SD_ASYM_CPUCAPACITY sched_domain topology flag

Message ID 1466615004-3503-5-git-send-email-morten.rasmussen@arm.com
State Superseded
Headers show

Commit Message

Morten Rasmussen June 22, 2016, 5:03 p.m. UTC
Add a topology flag to the sched_domain hierarchy indicating
sched_groups at this sched_domain level having different per cpu
capacity (e.g. big.LITTLE big-only and little-only groups) or groups in
sibling domains with different capacity. IOW, domains not spanning cpus
of all available capacities up until and including the first level
spanning cpus of all capacities available system wide. This information
is currently only available through iterating through the capacities of
all the cpus at parent levels in the sched_domain hierarchy.

SD 2      [  0      1      2      3]  SD_ASYM_CPUCAPACITY

SD 1      [  0      1] [   2      3]  SD_ASYM_CPUCAPACITY

cpu:         0      1      2      3
capacity:  756    756   1024   1024

cc: Ingo Molnar <mingo@redhat.com>
cc: Peter Zijlstra <peterz@infradead.org>

Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com>

---
 include/linux/sched.h | 1 +
 kernel/sched/core.c   | 6 +++++-
 2 files changed, 6 insertions(+), 1 deletion(-)

-- 
1.9.1

Comments

Morten Rasmussen July 11, 2016, 10:42 a.m. UTC | #1
On Mon, Jul 11, 2016 at 11:55:23AM +0200, Peter Zijlstra wrote:
> On Wed, Jun 22, 2016 at 06:03:15PM +0100, Morten Rasmussen wrote:

> > Add a topology flag to the sched_domain hierarchy indicating

> > sched_groups at this sched_domain level having different per cpu

> > capacity (e.g. big.LITTLE big-only and little-only groups) or groups in

> > sibling domains with different capacity.

> 

> >                                          IOW, domains not spanning cpus

> > of all available capacities up until and including the first level

> > spanning cpus of all capacities available system wide.

> 

> This ^, which would be SD1 below, why? I would expect only SD2 to be

> tagged, since that does indeed have asymmetric capacities.


That would make most sense, but it complicates how we can use the flag.
See reply to your related question for patch #5.
diff mbox

Patch

diff --git a/include/linux/sched.h b/include/linux/sched.h
index d31a3ca1cd64..62c3584fc69a 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1020,6 +1020,7 @@  extern void wake_up_q(struct wake_q_head *head);
 #define SD_BALANCE_FORK		0x0008	/* Balance on fork, clone */
 #define SD_BALANCE_WAKE		0x0010  /* Balance on wakeup */
 #define SD_WAKE_AFFINE		0x0020	/* Wake task to waking CPU */
+#define SD_ASYM_CPUCAPACITY	0x0040  /* Groups have only a subset of cpu capacities */
 #define SD_SHARE_CPUCAPACITY	0x0080	/* Domain members share cpu capacity */
 #define SD_SHARE_POWERDOMAIN	0x0100	/* Domain members share power domain */
 #define SD_SHARE_PKG_RESOURCES	0x0200	/* Domain members share cpu pkg resources */
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 385c947482e1..351609279341 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5677,6 +5677,7 @@  static int sd_degenerate(struct sched_domain *sd)
 			 SD_BALANCE_FORK |
 			 SD_BALANCE_EXEC |
 			 SD_SHARE_CPUCAPACITY |
+			 SD_ASYM_CPUCAPACITY |
 			 SD_SHARE_PKG_RESOURCES |
 			 SD_SHARE_POWERDOMAIN)) {
 		if (sd->groups != sd->groups->next)
@@ -5707,6 +5708,7 @@  sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
 				SD_BALANCE_NEWIDLE |
 				SD_BALANCE_FORK |
 				SD_BALANCE_EXEC |
+				SD_ASYM_CPUCAPACITY |
 				SD_SHARE_CPUCAPACITY |
 				SD_SHARE_PKG_RESOURCES |
 				SD_PREFER_SIBLING |
@@ -6321,14 +6323,16 @@  static int sched_domains_curr_level;
  * SD_NUMA                - describes NUMA topologies
  * SD_SHARE_POWERDOMAIN   - describes shared power domain
  *
- * Odd one out:
+ * Odd ones out:
  * SD_ASYM_PACKING        - describes SMT quirks
+ * SD_ASYM_CPUCAPACITY    - describes mixed capacity topologies
  */
 #define TOPOLOGY_SD_FLAGS		\
 	(SD_SHARE_CPUCAPACITY |		\
 	 SD_SHARE_PKG_RESOURCES |	\
 	 SD_NUMA |			\
 	 SD_ASYM_PACKING |		\
+	 SD_ASYM_CPUCAPACITY |		\
 	 SD_SHARE_POWERDOMAIN)
 
 static struct sched_domain *