Messages in this thread | | | Subject | Re: 2.6.39-rc6-mmotm0506 - lockdep splat in RCU code on page fault | From | Valdis.Kletnieks@vt ... | Date | Wed, 11 May 2011 19:11:34 -0400 |
| |
On Tue, 10 May 2011 01:20:29 PDT, "Paul E. McKenney" said:
Would test, but it doesn't apply cleanly to my -mmotm0506 tree:
> diff --git a/kernel/rcutree.c b/kernel/rcutree.c > index 5616b17..20c22c5 100644 > --- a/kernel/rcutree.c > +++ b/kernel/rcutree.c > @@ -1525,13 +1525,15 @@ static void rcu_cpu_kthread_setrt(int cpu, int to_rt) > */ > static void rcu_cpu_kthread_timer(unsigned long arg) > { > - unsigned long flags; > + unsigned long old; > + unsigned long new; > struct rcu_data *rdp = per_cpu_ptr(rcu_state->rda, arg); > struct rcu_node *rnp = rdp->mynode; > > - raw_spin_lock_irqsave(&rnp->lock, flags); > - rnp->wakemask |= rdp->grpmask; > - raw_spin_unlock_irqrestore(&rnp->lock, flags); > + do { > + old = rnp->wakemask; > + new = old | rdp->grpmask; > + } while (cmpxchg(&rnp->wakemask, old, new) != old); > invoke_rcu_node_kthread(rnp); > }
My source has this:
raw_spin_lock_irqsave(&rnp->lock, flags); rnp->wakemask |= rdp->grpmask; invoke_rcu_node_kthread(rnp); raw_spin_unlock_irqrestore(&rnp->lock, flags);
the last 2 lines swapped from what you diffed against. I can easily work around that, except it's unclear what the implications of the invoke_rcu moving outside of the irq save/restore pair (or if it being inside is the actual root cause)...
[unhandled content-type:application/pgp-signature] | |