Messages in this thread | | | Date | Sun, 28 Apr 2019 21:58:34 +1000 | From | Nicholas Piggin <> | Subject | Re: [PATCH] kernel/sched: run nohz idle load balancer on HK_FLAG_MISC CPUs |
| |
Wanpeng Li's on April 28, 2019 5:01 pm: > On Fri, 12 Apr 2019 at 12:27, Nicholas Piggin <npiggin@gmail.com> wrote: >> >> The nohz idle balancer runs on the lowest idle CPU. This can >> interfere with isolated CPUs, so confine it to HK_FLAG_MISC >> housekeeping CPUs. >> >> HK_FLAG_SCHED is not used for this because it is not set anywhere >> at the moment. This could be folded into HK_FLAG_SCHED once that >> option is fixed. >> >> The problem was observed with increased jitter on an application >> running on CPU0, caused by nohz idle load balancing being run on >> CPU1 (an SMT sibling). >> >> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> >> --- >> kernel/sched/fair.c | 16 ++++++++++------ >> 1 file changed, 10 insertions(+), 6 deletions(-) >> >> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c >> index fdab7eb6f351..d29ca323214d 100644 >> --- a/kernel/sched/fair.c >> +++ b/kernel/sched/fair.c >> @@ -9522,22 +9522,26 @@ static inline int on_null_domain(struct rq *rq) >> * - When one of the busy CPUs notice that there may be an idle rebalancing >> * needed, they will kick the idle load balancer, which then does idle >> * load balancing for all the idle CPUs. >> + * - HK_FLAG_MISC CPUs are used for this task, because HK_FLAG_SCHED not set >> + * anywhere yet. >> */ >> >> static inline int find_new_ilb(void) >> { >> - int ilb = cpumask_first(nohz.idle_cpus_mask); >> + int ilb; >> >> - if (ilb < nr_cpu_ids && idle_cpu(ilb)) >> - return ilb; >> + for_each_cpu_and(ilb, nohz.idle_cpus_mask, >> + housekeeping_cpumask(HK_FLAG_MISC)) { >> + if (idle_cpu(ilb)) >> + return ilb; >> + } > > What will happen if cpu1 is still idle currently && housekeeping?
Then it will run the ilb.
In the customer scenario, cpu1 will not be in the housekeeping mask.
Thanks, Nick
| |