Messages in this thread | | | Subject | Re: sched: Improve load balancing in the presence of idle CPUs | From | Jason Low <> | Date | Mon, 13 Apr 2015 15:49:20 -0700 |
| |
> > --- > > diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c > > index fdae26e..d636bf7 100644 > > --- a/kernel/sched/fair.c > > +++ b/kernel/sched/fair.c > > @@ -7620,6 +7620,16 @@ out: > > } > > > > #ifdef CONFIG_NO_HZ_COMMON > > +static inline bool nohz_kick_needed(struct rq *rq); > > + > > +static inline void pass_nohz_balance(struct rq *this_rq, int this_cpu) > > +{ > > + clear_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu)); > > + nohz.next_balance = jiffies; > > + if (nohz_kick_needed(this_rq)) > > + nohz_balancer_kick(); > > +} > > + > > /* > > * In CONFIG_NO_HZ_COMMON case, the idle balance kickee will do the > > * rebalancing for all the cpus for whom scheduler ticks are stopped. > > @@ -7631,8 +7641,10 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) > > int balance_cpu; > > > > if (idle != CPU_IDLE || > > - !test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu))) > > - goto end; > > + !test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu))) { > > + pass_nohz_balance(this_rq, this_cpu); > > + return; > > + }
hmm, so taking a look at the patch again, it looks like we pass nohz balance even when the NOHZ_BALANCE_KICK is not set on the current CPU. We should separate the 2 conditions:
if (!test_bit(NOHZ_BALANCE_KICK, nohz_flags(this_cpu))) return;
if (idle != CPU_IDLE) { /* another CPU continue balancing */ pass_nohz_balance(this_rq, this_cpu); return; }
In general, separating the check also optimizes nohz_idle_balance() to avoid clearing the bit when it is not set.
| |