Messages in this thread | | | Date | Mon, 14 Dec 2009 06:16:07 -0800 | From | "Paul E. McKenney" <> | Subject | Re: [patch 0/9] Fix various __task_cred related invalid RCU assumptions |
| |
On Mon, Dec 14, 2009 at 11:17:39AM +0100, Peter Zijlstra wrote: > On Sun, 2009-12-13 at 17:53 -0800, Paul E. McKenney wrote: > > On Sun, Dec 13, 2009 at 07:56:17PM +0100, Peter Zijlstra wrote: > > > On Wed, 2009-12-09 at 21:34 -0800, Paul E. McKenney wrote: > > > > > > > Ah -- I have a related lockdep question. Is there a primitive that says > > > > whether or not the current task holds at least one lock of any type? > > > > If so, I would like to make rcu_dereference() do at least a little crude > > > > checking for this problem. > > > > > > Hmm, no, but that's not hard to do, however I actually implemented > > > something like that for RCU a long while ago and that gives a metric TON > > > of false positives due to things like the radix tree which are RCU-safe > > > but are not required to be used with RCU. > > > > Understood -- my current guess is that there needs to be a way to tag > > a variant of the rcu_dereference() API with the conditions that must be > > met, for example, either in an rcu-sched read-side critical section or > > holding a specific type of lock. > > > > This does make it a little harder to retroactively add checking to > > existing calls to rcu_dereference(), but should allow a good balance > > between false positives and false negatives going forward. > > > > Seem reasonable, or am I still missing something? > > The only concern is drowning in rcu_dereference() annotations. But I > guess that is unavoidable.
So far, I haven't been able to think of anything better. :-/
> I think you can use lock_is_held(&rcu_lock_map), except you need to deal > with the !debug_locks case, because lockdep stops once debug_locks > becomes false, which means lock_is_held() will return rubbish.
OK, so I need to do something like the following, then?
debug_locks ? lock_is_held(&rcu_lock_map) : 1
Thanx, Paul
| |