Re: [tip: locking/core] lockdep: Fix lockdep recursion

From: Peter Zijlstra
Date: Thu Oct 15 2020 - 05:50:51 EST


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?