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

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to