diff options
Diffstat (limited to 'kernel/sched/topology.c')
| -rw-r--r-- | kernel/sched/topology.c | 27 | 
1 files changed, 13 insertions, 14 deletions
diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c index dfb64c08a407..8344757bba6e 100644 --- a/kernel/sched/topology.c +++ b/kernel/sched/topology.c @@ -317,8 +317,9 @@ static void sched_energy_set(bool has_eas)   * EAS can be used on a root domain if it meets all the following conditions:   *    1. an Energy Model (EM) is available;   *    2. the SD_ASYM_CPUCAPACITY flag is set in the sched_domain hierarchy. - *    3. the EM complexity is low enough to keep scheduling overheads low; - *    4. schedutil is driving the frequency of all CPUs of the rd; + *    3. no SMT is detected. + *    4. the EM complexity is low enough to keep scheduling overheads low; + *    5. schedutil is driving the frequency of all CPUs of the rd;   *   * The complexity of the Energy Model is defined as:   * @@ -360,6 +361,13 @@ static bool build_perf_domains(const struct cpumask *cpu_map)  		goto free;  	} +	/* EAS definitely does *not* handle SMT */ +	if (sched_smt_active()) { +		pr_warn("rd %*pbl: Disabling EAS, SMT is not supported\n", +			cpumask_pr_args(cpu_map)); +		goto free; +	} +  	for_each_cpu(i, cpu_map) {  		/* Skip already covered CPUs. */  		if (find_pd(pd, i)) @@ -1374,18 +1382,9 @@ sd_init(struct sched_domain_topology_level *tl,  	 * Convert topological properties into behaviour.  	 */ -	if (sd->flags & SD_ASYM_CPUCAPACITY) { -		struct sched_domain *t = sd; - -		/* -		 * Don't attempt to spread across CPUs of different capacities. -		 */ -		if (sd->child) -			sd->child->flags &= ~SD_PREFER_SIBLING; - -		for_each_lower_domain(t) -			t->flags |= SD_BALANCE_WAKE; -	} +	/* Don't attempt to spread across CPUs of different capacities. */ +	if ((sd->flags & SD_ASYM_CPUCAPACITY) && sd->child) +		sd->child->flags &= ~SD_PREFER_SIBLING;  	if (sd->flags & SD_SHARE_CPUCAPACITY) {  		sd->imbalance_pct = 110;  |