On Thu, 19 Jan 2012, Eric Dumazet wrote: > Le jeudi 19 janvier 2012 à 04:28 -0800, Tejun Heo a écrit : > > Hello, > > > > On Wed, Jan 18, 2012 at 11:33 PM, Eric Dumazet <eric.dumazet@xxxxxxxxx> wrote: > > > Interesting, but should be a patch on its own. > > > > Yeap, agreed. Okay, in that case I'd better split into three (idr, revert, remove lock). I'll send those three in a moment. I've also slipped an RCU comment from idr_find into idr_get_next, and put the Acks in all three. > > > > > Maybe other idr users can benefit from your idea as well, if patch is > > > labeled "idr: allow idr_get_next() from rcu_read_lock" or something... > > > > > > I suggest introducing idr_get_next_rcu() helper to make the check about > > > rcu cleaner. > > > > > > idr_get_next_rcu(...) > > > { > > > WARN_ON_ONCE(!rcu_read_lock_held()); > > > return idr_get_next(...); > > > } > > > > Hmmm... I don't know. Does having a separate set of interface help > > much? It's easy to avoid/miss the test by using the other one. If we > > really worry about it, maybe indicating which locking is to be used > > during init is better? We can remember the lockdep map and trigger > > WARN_ON_ONCE() if neither the lock or RCU read lock is held. > > > There is a rcu_dereference_raw(ptr) in idr_get_next() > > This could be changed to rcu_dereference_check(ptr, condition) to get > lockdep support for free :) > > [ condition would be the appropriate > lockdep_is_held(&the_lock_protecting_my_idr) or 'I use the rcu variant' > and I hold rcu_read_lock ] > > This would need to add a 'condition' parameter to idr_gen_next(), but we > have very few users in kernel at this moment. idr_get_next() was introduced for memcg, and has only one other user user in the tree (drivers/mtd/mtdcore.c, which uses a mutex to lock it). With the RCU fix, idr_get_next() becomes very much like idr_find(). I'll leave any fiddling with their interfaces to you guys. Hugh