On 2017-10-10 14:43:13 [-0700], Paul E. McKenney wrote: > diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c > index 6d5880089ff6..558f9e7b283e 100644 > --- a/kernel/rcu/srcutree.c > +++ b/kernel/rcu/srcutree.c > @@ -830,7 +866,7 @@ void __call_srcu(struct srcu_struct *sp, struct rcu_head > *rhp, > rhp->func = func; > local_irq_save(flags); > sdp = this_cpu_ptr(sp->sda); > - raw_spin_lock_rcu_node(sdp); > + spin_lock_rcu_node(sdp);
This and the same thing in srcu_might_be_idle() does not work because local_irq_save() + spin_lock() != spin_lock_irqsave() but local_irq_save() + raw_spinlock = raw_spin_lock_irqsave() I think that preempt_disable() for a stable this_cpu_ptr() is enough here. I replaced local_irq_save() with local_lock_irqsave() on RT which provides a per-CPU spinlock (for mutual exclusion) and disables interrupts in !RT mode. I've been testing this for a while and it seems to work. Thank you. > rcu_segcblist_enqueue(&sdp->srcu_cblist, rhp, false); > rcu_segcblist_advance(&sdp->srcu_cblist, > rcu_seq_current(&sp->srcu_gp_seq)); Sebastian