On Thu, Oct 15, 2020 at 11:49:26AM +0200, Peter Zijlstra wrote: > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -1143,13 +1143,15 @@ bool rcu_lockdep_current_cpu_online(void > struct rcu_data *rdp; > struct rcu_node *rnp; > bool ret = false; > + unsigned long seq; > > if (in_nmi() || !rcu_scheduler_fully_active) > return true; > preempt_disable_notrace(); > rdp = this_cpu_ptr(&rcu_data); > rnp = rdp->mynode; > - if (rdp->grpmask & rcu_rnp_online_cpus(rnp)) > + seq = READ_ONCE(rnp->ofl_seq) & ~0x1; > + if (rdp->grpmask & rcu_rnp_online_cpus(rnp) || seq != READ_ONCE(rnp->ofl_seq)) > ret = true; > preempt_enable_notrace(); > return ret; Also, here, are the two loads important? Wouldn't: || READ_ONCE(rnp->ofl_seq) & 0x1 be sufficient?