On 20 December 2017 at 15:03, Peter Zijlstra <pet...@infradead.org> wrote: > On Fri, Dec 01, 2017 at 06:01:56PM +0000, Brendan Jackman wrote: >> @@ -8955,8 +8964,20 @@ static void nohz_balancer_kick(void) >> if (ilb_cpu >= nr_cpu_ids) >> return; >> >> - if (test_and_set_bit(NOHZ_BALANCE_KICK, nohz_flags(ilb_cpu))) >> + if (test_and_set_bit(NOHZ_BALANCE_KICK, nohz_flags(ilb_cpu))) { >> + if (!only_update) { >> + /* >> + * There's a pending/ongoing nohz kick/balance. If it's >> + * just for stats, convert it to a proper load balance. >> + */ >> + clear_bit(NOHZ_STATS_KICK, nohz_flags(ilb_cpu)); >> + } >> return; >> + } >> + >> + if (only_update) >> + set_bit(NOHZ_STATS_KICK, nohz_flags(ilb_cpu)); >> + >> /* >> * Use smp_send_reschedule() instead of resched_cpu(). >> * This way we generate a sched IPI on the target cpu which > > This looks racy.. if its not we don't need atomic ops, if it is but is > still fine it needs a comment.
NOHZ_STATS_KICK modification is protected by test_and_set_bit(NOHZ_BALANCE_KICK. You're right that we don't need atomics ops and __set_bit() is enough