On Tue, 29 Aug 2006 19:28:16 +0400 Alexey Kuznetsov <[EMAIL PROTECTED]> wrote:
> Hello! > > > @@ -346,8 +354,8 @@ struct neighbour *neigh_lookup(struct ne > > > > NEIGH_CACHE_STAT_INC(tbl, lookups); > > > > - read_lock_bh(&tbl->lock); > > - hlist_for_each_entry(n, tmp, &tbl->hash_buckets[hash_val], hlist) { > > + rcu_read_lock(); > > + hlist_for_each_entry_rcu(n, tmp, &tbl->hash_buckets[hash_val], hlist) { > > if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) { > > neigh_hold(n); > > NEIGH_CACHE_STAT_INC(tbl, hits); > > Sure? Seems, you cannot grab refcnt here, the entry can be already > released. > > Probably, you should do atomic_inc_and_test() here and restart lookup, > if it fails. > > Alexey atomic_inc_and_test is true iff result is zero, so that won't work. But the following should work: hlist_for_each_entry_rcu(n, tmp, &tbl->hash_buckets[hash_val], hlist) { if (dev == n->dev && !memcmp(n->primary_key, pkey, key_len)) { if (unlikely(&atomic_inc_return(&n->refcnt) == 1)) { neigh_release(n); continue; } NEIGH_CACHE_STAT_INC(tbl, hits); I'll wrap the atomic_inc_return inside neigh_hold_return() -- Stephen Hemminger <[EMAIL PROTECTED]> - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html