Messages in this thread Patch in this message | | | Date | Mon, 11 Oct 2021 10:58:02 -0400 | From | Steven Rostedt <> | Subject | Re: [PATCH] sched/fair: Use this_sd->weight to calculate span_avg |
| |
On Sun, 10 Oct 2021 02:10:55 +0800 Tao Zhou <tao.zhou@linux.dev> wrote:
> avg_idle, avg_cost got from this_rq and this_sd. I think > use this_sd->weight to calculate and estimate the number > of loop cpus in the target domain.
If that's the case, then shouldn't the CPUs to be checked come from this_sd as well? I mean, at the beginning of the function we have:
this_sd = rcu_dereference(*this_cpu_ptr(&sd_llc)); if (!this_sd) return -1;
cpumask_and(cpus, sched_domain_span(sd), p->cpus_ptr);
Where "cpus" comes from sd, and not this_sd.
> --- > kernel/sched/fair.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > index f6a05d9b5443..7fab7b70814c 100644 > --- a/kernel/sched/fair.c > +++ b/kernel/sched/fair.c > @@ -6300,7 +6300,7 @@ static int select_idle_cpu(struct task_struct *p, struct sched_domain *sd, bool > avg_idle = this_rq->wake_avg_idle; > avg_cost = this_sd->avg_scan_cost + 1; > > - span_avg = sd->span_weight * avg_idle; > + span_avg = this_sd->span_weight * avg_idle; > if (span_avg > 4*avg_cost) > nr = div_u64(span_avg, avg_cost); > else
And after this code, the nr that is determined from the above, is for limiting the looping over those CPUs from sd, not this_sd:
for_each_cpu_wrap(cpu, cpus, target + 1) { if (has_idle_core) { i = select_idle_core(p, cpu, cpus, &idle_cpu); if ((unsigned int)i < nr_cpumask_bits) return i;
} else { if (!--nr) return -1; idle_cpu = __select_idle_cpu(cpu, p); if ((unsigned int)idle_cpu < nr_cpumask_bits) break; } }
I'm guessing there's nothing wrong here. But, I don't fully understand it myself.
-- Steve
| |