Re: [PATCH v3 3/4] sched/fair: Allow load balancing between CPUs of identical capacity
From: Ricardo Neri
Date: Sun May 17 2026 - 23:02:26 EST
On Fri, May 15, 2026 at 11:16:00PM +0800, Chen, Yu C wrote:
> On 5/15/2026 2:34 AM, Ricardo Neri wrote:
> > 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 arch_scale_cpu_capacity() to reflect architectural capacity, excluding
> > runtime reductions due to side activity or thermal 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@xxxxxxxxxxxxxxx>
> > ---
> > Changes in v3:
> > * Reverted the inverted capacity check; the inverted form incorrectly
> > allows migrations to CPUs of slightly less capacity.
> > * Guarded the check for architectural capacity with the
> > sched_cluster_active static key.
> >
> > Changes in v2:
> > * Used arch_scale_cpu_capacity() instead of capacity_of() to ignore
> > runtime variability.
> > * Inverted the check for runtime capacity. (Christian)
> > * Reworded patch description for clarity.
> > ---
> > kernel/sched/fair.c | 6 ++++++
> > 1 file changed, 6 insertions(+)
> >
> > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> > index dcc02ceb44b5..d2a4c529f67f 100644
> > --- a/kernel/sched/fair.c
> > +++ b/kernel/sched/fair.c
> > @@ -11846,8 +11846,14 @@ static struct rq *sched_balance_find_src_rq(struct lb_env *env,
> > * eventually lead to active_balancing high->low capacity.
> > * Higher per-CPU capacity is considered better than balancing
> > * average load.
> > + *
> > + * CONFIG_SCHED_CLUSTER requires balancing load across clusters
> > + * of identical capacity. Use architectural capacity to ignore
> > + * runtime variability.
> > */
> > if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
> > + (!static_branch_unlikely(&sched_cluster_active) ||
> > + arch_scale_cpu_capacity(env->dst_cpu) != arch_scale_cpu_capacity(i)) &&
> > !capacity_greater(capacity_of(env->dst_cpu), capacity) &&
>
> As stated in the commit log, the existing logic blocks task migrations
> between CPUs
> with identical capacity, which is based on capacity_of() comparison rather
> than
> arch_scale_cpu_capacity.
Thanks for your review!
> Could I kindly ask why replacing
> !capacity_greater(capacity_of(env->dst_cpu), capacity)
This check only allows balance if dst_cpu has more than 1.05x runtime
capacity than the CPU under consideration (i in the loop in this function).
> with
> capacity_greater(capacity, capacity_of(env->dst_cpu))
> does not achieve the expected effect?
The problem with inverting the check is that it would allow balance if
dst_cpu has more than 0.95x runtime capacity than the CPU under
consideration, effectively allowing migrations to lower-capacity CPUs.
> This would theoretically enable migration among equal-capacity CPUs, and
> in most cases e-cores in different clusters should return 0 thus
> load balance is allowed.
Yes, it would meet the condition you describe, but also has the side
effect described above.
For this reason I decided to target the specific case of identical
architectural capacity.
>
> thanks,
> Chenyu
>