mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	sched/topology: Add static_key for asymmetric CPU capacity optimizations
The existing asymmetric CPU capacity code should cause minimal overhead for others. Putting it behind a static_key, it has been done for SMT optimizations, would make it easier to extend and improve without causing harm to others moving forward. Signed-off-by: Morten Rasmussen <morten.rasmussen@arm.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: dietmar.eggemann@arm.com Cc: gaku.inami.xh@renesas.com Cc: valentin.schneider@arm.com Cc: vincent.guittot@linaro.org Link: http://lkml.kernel.org/r/1530699470-29808-2-git-send-email-morten.rasmussen@arm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									e1799a80a4
								
							
						
					
					
						commit
						df054e8445
					
				
					 3 changed files with 12 additions and 1 deletions
				
			
		|  | @ -6188,6 +6188,9 @@ static int wake_cap(struct task_struct *p, int cpu, int prev_cpu) | ||||||
| { | { | ||||||
| 	long min_cap, max_cap; | 	long min_cap, max_cap; | ||||||
| 
 | 
 | ||||||
|  | 	if (!static_branch_unlikely(&sched_asym_cpucapacity)) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
| 	min_cap = min(capacity_orig_of(prev_cpu), capacity_orig_of(cpu)); | 	min_cap = min(capacity_orig_of(prev_cpu), capacity_orig_of(cpu)); | ||||||
| 	max_cap = cpu_rq(cpu)->rd->max_cpu_capacity; | 	max_cap = cpu_rq(cpu)->rd->max_cpu_capacity; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1185,6 +1185,7 @@ DECLARE_PER_CPU(int, sd_llc_id); | ||||||
| DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); | 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_numa); | ||||||
| DECLARE_PER_CPU(struct sched_domain *, sd_asym); | DECLARE_PER_CPU(struct sched_domain *, sd_asym); | ||||||
|  | extern struct static_key_false sched_asym_cpucapacity; | ||||||
| 
 | 
 | ||||||
| struct sched_group_capacity { | struct sched_group_capacity { | ||||||
| 	atomic_t		ref; | 	atomic_t		ref; | ||||||
|  |  | ||||||
|  | @ -398,6 +398,7 @@ DEFINE_PER_CPU(int, sd_llc_id); | ||||||
| DEFINE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); | 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_numa); | ||||||
| DEFINE_PER_CPU(struct sched_domain *, sd_asym); | DEFINE_PER_CPU(struct sched_domain *, sd_asym); | ||||||
|  | DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity); | ||||||
| 
 | 
 | ||||||
| static void update_top_cache_domain(int cpu) | static void update_top_cache_domain(int cpu) | ||||||
| { | { | ||||||
|  | @ -1705,6 +1706,7 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att | ||||||
| 	struct rq *rq = NULL; | 	struct rq *rq = NULL; | ||||||
| 	int i, ret = -ENOMEM; | 	int i, ret = -ENOMEM; | ||||||
| 	struct sched_domain_topology_level *tl_asym; | 	struct sched_domain_topology_level *tl_asym; | ||||||
|  | 	bool has_asym = false; | ||||||
| 
 | 
 | ||||||
| 	alloc_state = __visit_domain_allocation_hell(&d, cpu_map); | 	alloc_state = __visit_domain_allocation_hell(&d, cpu_map); | ||||||
| 	if (alloc_state != sa_rootdomain) | 	if (alloc_state != sa_rootdomain) | ||||||
|  | @ -1720,8 +1722,10 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att | ||||||
| 		for_each_sd_topology(tl) { | 		for_each_sd_topology(tl) { | ||||||
| 			int dflags = 0; | 			int dflags = 0; | ||||||
| 
 | 
 | ||||||
| 			if (tl == tl_asym) | 			if (tl == tl_asym) { | ||||||
| 				dflags |= SD_ASYM_CPUCAPACITY; | 				dflags |= SD_ASYM_CPUCAPACITY; | ||||||
|  | 				has_asym = true; | ||||||
|  | 			} | ||||||
| 
 | 
 | ||||||
| 			sd = build_sched_domain(tl, cpu_map, attr, sd, dflags, i); | 			sd = build_sched_domain(tl, cpu_map, attr, sd, dflags, i); | ||||||
| 
 | 
 | ||||||
|  | @ -1773,6 +1777,9 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att | ||||||
| 	} | 	} | ||||||
| 	rcu_read_unlock(); | 	rcu_read_unlock(); | ||||||
| 
 | 
 | ||||||
|  | 	if (has_asym) | ||||||
|  | 		static_branch_enable_cpuslocked(&sched_asym_cpucapacity); | ||||||
|  | 
 | ||||||
| 	if (rq && sched_debug_enabled) { | 	if (rq && sched_debug_enabled) { | ||||||
| 		pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n", | 		pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n", | ||||||
| 			cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity); | 			cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Morten Rasmussen
						Morten Rasmussen