mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
sched/fair: Allow load balancing between CPUs of identical capacity
sched_balance_find_src_rq() avoids selecting a runqueue with a single running task as busiest if doing so results in migrating the task to a CPU with less than ~5% of extra capacity. It also unintentionally prevents migrations between CPUs of identical capacity. When CONFIG_SCHED_CLUSTER is enabled, load should be balanced across clusters of CPUs with the same capacity. Allowing migration between CPUs of identical capacity is necessary to meet this goal. Use get_actual_cpu_capacity() to reflect architectural capacity as well as diminished capacity due to hardware or cpufreq pressure. Guard this check with the sched_cluster_active static key so that systems without cluster topology are unaffected. Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Christian Loehle <christian.loehle@arm.com> Reviewed-by: Vincent Guittot <vincent.guittot@linaro.org> Tested-by: Christian Loehle <christian.loehle@arm.com> Tested-by: Andrea Righi <arighi@nvidia.com> Link: https://patch.msgid.link/20260720-rneri-fix-cas-clusters-v6-5-bb500bf4afd4@linux.intel.com
This commit is contained in:
parent
0fbd428d07
commit
7fd540b1bc
|
|
@ -13102,13 +13102,20 @@ static struct rq *sched_balance_find_src_rq(struct lb_env *env,
|
|||
*/
|
||||
if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
|
||||
nr_running == 1) {
|
||||
bool cluster_equal_cap = static_branch_unlikely(&sched_cluster_active) &&
|
||||
(get_actual_cpu_capacity(env->dst_cpu) ==
|
||||
get_actual_cpu_capacity(i));
|
||||
bool smt_degraded_cap = sched_smt_active() && !is_core_idle(i);
|
||||
|
||||
/*
|
||||
* Busy SMT siblings reduce the capacity of CPU @i. Do
|
||||
* not skip it in this case.
|
||||
*
|
||||
* CONFIG_SCHED_CLUSTER requires balancing load across
|
||||
* clusters of identical capacity, accounting for
|
||||
* hardware and cpufreq pressure.
|
||||
*/
|
||||
if (!smt_degraded_cap &&
|
||||
if (!smt_degraded_cap && !cluster_equal_cap &&
|
||||
!capacity_greater(capacity_of(env->dst_cpu), capacity))
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user