Re: [B.A.T.M.A.N.] [PATCH] batman-adv: fix locking in hash_add()

Sven Eckelmann
2012-05-08T20:38:58Z

[-- Attachment #1: Type: text/plain, Size: 1394 bytes --]

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 <mschiffer@universe-factory.net>
> ---
> 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 <sven@narfation.org>

Thanks,
Sven

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]