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; | ||||
| 
 | ||||
| 	if (!static_branch_unlikely(&sched_asym_cpucapacity)) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	min_cap = min(capacity_orig_of(prev_cpu), capacity_orig_of(cpu)); | ||||
| 	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 *, sd_numa); | ||||
| DECLARE_PER_CPU(struct sched_domain *, sd_asym); | ||||
| extern struct static_key_false sched_asym_cpucapacity; | ||||
| 
 | ||||
| struct sched_group_capacity { | ||||
| 	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 *, sd_numa); | ||||
| DEFINE_PER_CPU(struct sched_domain *, sd_asym); | ||||
| DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity); | ||||
| 
 | ||||
| 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; | ||||
| 	int i, ret = -ENOMEM; | ||||
| 	struct sched_domain_topology_level *tl_asym; | ||||
| 	bool has_asym = false; | ||||
| 
 | ||||
| 	alloc_state = __visit_domain_allocation_hell(&d, cpu_map); | ||||
| 	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) { | ||||
| 			int dflags = 0; | ||||
| 
 | ||||
| 			if (tl == tl_asym) | ||||
| 			if (tl == tl_asym) { | ||||
| 				dflags |= SD_ASYM_CPUCAPACITY; | ||||
| 				has_asym = true; | ||||
| 			} | ||||
| 
 | ||||
| 			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(); | ||||
| 
 | ||||
| 	if (has_asym) | ||||
| 		static_branch_enable_cpuslocked(&sched_asym_cpucapacity); | ||||
| 
 | ||||
| 	if (rq && sched_debug_enabled) { | ||||
| 		pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n", | ||||
| 			cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Morten Rasmussen
						Morten Rasmussen