On Fri, Dec 18, 2015 at 04:27:31PM -0500, David Miller wrote: > From: Herbert Xu > Date: Fri, 18 Dec 2015 21:14:08 +0800 > > > On Fri, Dec 18, 2015 at 04:54:14AM -0800, Eric Dumazet wrote: > >> > >> You can avoid the comment by using the self documented and lockdep > >> enabled primitive > >> > >> iter->walker->tbl = rcu_dereference_protected(ht->tbl, > >> lockdep_is_held(&ht->lock)); > > > > That is just gross. I think a comment is much better in this case. > > Herbert, this macro was created exactly to handle this situation, > and this is what we do everywhere else in the tree. OK. ---8<--- The commit f9f51b8070be3e829100614a7372b219723b864f ("rhashtable: Fix walker list corruption") causes a suspicious RCU usage warning because we no longer hold ht->mutex when we dereference ht->tbl. However, this is a false positive because we now hold ht->lock which also guarantees that ht->tbl won't disppear from under us. This patch kills the warning by using rcu_dereference_protected. Reported-by: kernel test robot Signed-off-by: Herbert Xu diff --git a/lib/rhashtable.c b/lib/rhashtable.c index eb9240c..51282f5 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -519,7 +519,8 @@ int rhashtable_walk_init(struct rhashtable *ht, struct rhashtable_iter *iter) return -ENOMEM; spin_lock(&ht->lock); - iter->walker->tbl = rht_dereference(ht->tbl, ht); + iter->walker->tbl = + rcu_dereference_protected(ht->tbl, lockdep_is_held(&ht->lock)); list_add(&iter->walker->list, &iter->walker->tbl->walkers); spin_unlock(&ht->lock); -- Email: Herbert Xu Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt