Re: [PATCH v5 1/6] sched/fair: Do not skip CPUs of similar capacity with busy SMT siblings

From: Vincent Guittot

Date: Tue Jun 23 2026 - 03:15:07 EST


On Tue, 23 Jun 2026 at 01:55, Ricardo Neri
<ricardo.neri-calderon@xxxxxxxxxxxxxxx> wrote:
>
> When picking a busiest CPU with only one running task, the function
> sched_balance_find_src_rq() skips candidate CPUs if the destination CPU has
> less than ~5% extra capacity. This condition only holds if all the SMT
> siblings of a CPU are idle.
>
> SMT siblings share the computing resources of a physical core and this
> results in reduced capacity if more than one sibling is busy.
>
> Skipping a CPU as described would prevent the load balancer from pulling
> tasks from a scheduling group previously and correctly identified as
> group_smt_balance (i.e., one with more than one task running).
>
> Do not skip a candidate CPU of similar capacity if it has busy SMT
> siblings.
>
> Reviewed-by: K Prateek Nayak <kprateek.nayak@xxxxxxx>
> Signed-off-by: Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx>

Reviewed-by: Vincent Guittot <vincent.guittot@xxxxxxxxxx>

> ---
> Changes in v5:
> * Optimized logic to identify CPUs with busy SMT siblings only when
> needed. (Prateek, Chen Yu)
> * Added Reviewed-by tag from Prateek. Thanks!
> * Christian also provided his Reviewed-by tag, but the patch changed
> significantly since then. I did not think it was correct to keep it
> without him reviewing the updated patch first.
>
> Changes in v4:
> * Introduced this patch.
>
> Changes in v3:
> * N/A
>
> Changes in v2:
> * N/A
> ---
> kernel/sched/fair.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index d78467ec6ee1..892abd7fcc18 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -12976,9 +12976,17 @@ static struct rq *sched_balance_find_src_rq(struct lb_env *env,
> * average load.
> */
> if (env->sd->flags & SD_ASYM_CPUCAPACITY &&
> - !capacity_greater(capacity_of(env->dst_cpu), capacity) &&
> - nr_running == 1)
> - continue;
> + nr_running == 1) {
> + 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.
> + */
> + if (!smt_degraded_cap &&
> + !capacity_greater(capacity_of(env->dst_cpu), capacity))
> + continue;
> + }
>
> /*
> * Make sure we only pull tasks from a CPU of lower priority
>
> --
> 2.43.0
>