> > --- > > 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. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/