diff options
Diffstat (limited to 'kernel/sched/topology.c')
| -rw-r--r-- | kernel/sched/topology.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index b5667a273bf6..49b835f1305f 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -1948,7 +1948,7 @@ next_level:  static int  build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *attr)  { -	enum s_alloc alloc_state; +	enum s_alloc alloc_state = sa_none;  	struct sched_domain *sd;  	struct s_data d;  	struct rq *rq = NULL; @@ -1956,6 +1956,9 @@ build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *att  	struct sched_domain_topology_level *tl_asym;  	bool has_asym = false; +	if (WARN_ON(cpumask_empty(cpu_map))) +		goto error; +  	alloc_state = __visit_domain_allocation_hell(&d, cpu_map);  	if (alloc_state != sa_rootdomain)  		goto error; @@ -2026,7 +2029,7 @@ 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); +		static_branch_inc_cpuslocked(&sched_asym_cpucapacity);  	if (rq && sched_debug_enabled) {  		pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n", @@ -2121,8 +2124,12 @@ int sched_init_domains(const struct cpumask *cpu_map)   */  static void detach_destroy_domains(const struct cpumask *cpu_map)  { +	unsigned int cpu = cpumask_any(cpu_map);  	int i; +	if (rcu_access_pointer(per_cpu(sd_asym_cpucapacity, cpu))) +		static_branch_dec_cpuslocked(&sched_asym_cpucapacity); +  	rcu_read_lock();  	for_each_cpu(i, cpu_map)  		cpu_attach_domain(NULL, &def_root_domain, i);  |