Re: [PATCH v3] sched/fair: Prefer fully idle cores for NOHZ balancing

From: K Prateek Nayak

Date: Tue Aug 04 2026 - 06:00:45 EST


Hello Vincent,

On 8/4/2026 2:12 PM, Vincent Guittot wrote:
>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>> index 37001c63452e5..574b6b3ee922a 100644
>> --- a/kernel/sched/fair.c
>> +++ b/kernel/sched/fair.c
>> @@ -13965,28 +13965,66 @@ static inline int on_null_domain(struct rq *rq)
>> static inline int find_new_ilb(void)
>> {
>> int this_cpu = smp_processor_id();
>> - const struct cpumask *hk_mask;
>> - int ilb_cpu;
>> + struct cpumask *ilb_cpus;
>> + int ilb_cpu, fallback = -1;
>> +
>> + lockdep_assert_irqs_disabled();
>>
>> - hk_mask = housekeeping_cpumask(HK_TYPE_KERNEL_NOISE);
>> + /*
>> + * Reuse the per-CPU select_rq_mask, which is protected from concurrent
>> + * use on this CPU by having interrupts disabled.
>> + */
>> + ilb_cpus = this_cpu_cpumask_var_ptr(select_rq_mask);
>> + cpumask_and(ilb_cpus, nohz.idle_cpus_mask,
>> + housekeeping_cpumask(HK_TYPE_KERNEL_NOISE));
>>
>> - for_each_cpu_and(ilb_cpu, nohz.idle_cpus_mask, hk_mask) {
>> + for_each_cpu(ilb_cpu, ilb_cpus) {
>> if (ilb_cpu == this_cpu)
>
> this_cpu is not idle so you can apply the same as below

Dumb question: nohz_balancer_kick() already does a
nohz_balance_exit_idle(rq) before trying to find the ilb_cpu via
find_new_ilb() so is it even possible for this_cpu to be set on the
nohz.idle_cpus_mask here?

Even on weakly ordered systems, reads and writes to the same location
(nohz.idle_cpus_mask) cannot get reordered right?

>
> Other than that looks good to me
>
>> continue;
>>
>> - if (idle_cpu(ilb_cpu))
>> - return ilb_cpu;
>> + if (!idle_cpu(ilb_cpu)) {
>
> + if (ilb_cpu == this_cpu || !idle_cpu(ilb_cpu)) {

Otherwise, this makes sense.

--
Thanks and Regards,
Prateek