Re: [PATCH] sched/fair: Make is_core_idle() check all cpus in a core
From: Zhan Xusheng
Date: Thu Aug 06 2026 - 23:42:29 EST
On Thu, 06 Aug 2026 20:18:56 +0200, Mete Durlu wrote:
> Fix this by removing the check that skips the passed CPU when evaluating
> idle_cpu(), ensuring is_core_idle() now correctly determines if the entire
> core (including the passed CPU) is idle.
The skip is what lets a caller ask this from a CPU that is about to become
idle, where idle_cpu() cannot be true yet.
sched_balance_newidle() calls
sched_balance_rq(this_cpu, this_rq, sd, CPU_NEWLY_IDLE, ...)
so env->dst_cpu is this_cpu, and we are inside __schedule() with rq->curr
still the outgoing task. idle_rq() wants rq->curr == rq->idle, so
idle_cpu(this_cpu) is false. __CPU_NOT_IDLE is 0, so the env->idle test in
update_sg_lb_stats() does not filter CPU_NEWLY_IDLE out either. For every
newidle balance the patch therefore gives:
env->dst_core_idle false, so the misfit gate in
update_sd_pick_busiest() stops pulling
sched_use_asym_prio() false, so asym packing no longer applies
s390 cannot show that: SD_ASYM_PACKING is set only by powerpc and x86 ITMT,
SD_ASYM_CPUCAPACITY only by arm64 big.LITTLE and x86 hybrid.
The other callers -- numa_idle_core(), select_idle_capacity(),
asym_fits_cpu(), should_we_balance() -- all establish idle_cpu(cpu) first,
so there this only adds a redundant idle_cpu() per candidate, two of them
on the wakeup path.
Since the complaint is really the name, would renaming it do the job
without touching behaviour? asym_fits_cpu() already words it as "the core
has no busy siblings", and sched_use_asym_prio()'s kernel-doc treats @cpu's
idleness as the caller's precondition.
dst_core_idle may well want whole-core semantics as its comment says, but
that reads like a separate patch with numbers from an asymmetric-capacity
machine.
Thanks,
Zhan Xusheng