On Tuesday 08 May 2012 22:31:57 Matthias Schiffer wrote: > To ensure an entry isn't added twice all comparisons have to be protected by > the hash line write spinlock. This doesn't really hurt as the case that it > is tried to add an element already present to the hash shouldn't occur very > often, so in most cases the lock would have have to be taken anyways. > > Signed-off-by: Matthias Schiffer <[email protected]> > --- > hash.h | 15 ++++++--------- > 1 file changed, 6 insertions(+), 9 deletions(-) > > diff --git a/hash.h b/hash.h > index 7bcb98f..2e0409a 100644 > --- a/hash.h > +++ b/hash.h > @@ -109,26 +109,23 @@ static inline int hash_add(struct hashtable_t *hash, > head = &hash->table[index]; > list_lock = &hash->list_locks[index]; > > - rcu_read_lock(); > - __hlist_for_each_rcu(node, head) { > + spin_lock_bh(list_lock); > + > + hlist_for_each(node, head) { > if (!compare(node, data)) > continue; > > ret = 1; > - goto err_unlock; > + goto unlock; > } > - rcu_read_unlock(); > > /* no duplicate found in list, add new element */ > - spin_lock_bh(list_lock); > hlist_add_head_rcu(data_node, head); > - spin_unlock_bh(list_lock); > > ret = 0; > - goto out; > > -err_unlock: > - rcu_read_unlock(); > +unlock: > + spin_unlock_bh(list_lock); > out: > return ret; > }
Acked-by: Sven Eckelmann <[email protected]> Thanks, Sven
signature.asc
Description: This is a digitally signed message part.
