Commit 13977072 authored by Ben Hutchings's avatar Ben Hutchings Committed by Stefan Bader

rhashtable: Add rhashtable_lookup()

BugLink: https://bugs.launchpad.net/bugs/1818806

Extracted from commit ca26893f "rhashtable: Add rhlist interface".

Cc: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarBen Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
parent ef555d8c
...@@ -515,18 +515,8 @@ static inline int rhashtable_compare(struct rhashtable_compare_arg *arg, ...@@ -515,18 +515,8 @@ static inline int rhashtable_compare(struct rhashtable_compare_arg *arg,
return memcmp(ptr + ht->p.key_offset, arg->key, ht->p.key_len); return memcmp(ptr + ht->p.key_offset, arg->key, ht->p.key_len);
} }
/** /* Internal function, do not use. */
* rhashtable_lookup_fast - search hash table, inlined version static inline struct rhash_head *__rhashtable_lookup(
* @ht: hash table
* @key: the pointer to the key
* @params: hash table parameters
*
* Computes the hash value for the key and traverses the bucket chain looking
* for a entry with an identical key. The first matching entry is returned.
*
* Returns the first entry on which the compare function returned true.
*/
static inline void *rhashtable_lookup_fast(
struct rhashtable *ht, const void *key, struct rhashtable *ht, const void *key,
const struct rhashtable_params params) const struct rhashtable_params params)
{ {
...@@ -538,8 +528,6 @@ static inline void *rhashtable_lookup_fast( ...@@ -538,8 +528,6 @@ static inline void *rhashtable_lookup_fast(
struct rhash_head *he; struct rhash_head *he;
unsigned int hash; unsigned int hash;
rcu_read_lock();
tbl = rht_dereference_rcu(ht->tbl, ht); tbl = rht_dereference_rcu(ht->tbl, ht);
restart: restart:
hash = rht_key_hashfn(ht, tbl, key, params); hash = rht_key_hashfn(ht, tbl, key, params);
...@@ -548,8 +536,7 @@ static inline void *rhashtable_lookup_fast( ...@@ -548,8 +536,7 @@ static inline void *rhashtable_lookup_fast(
params.obj_cmpfn(&arg, rht_obj(ht, he)) : params.obj_cmpfn(&arg, rht_obj(ht, he)) :
rhashtable_compare(&arg, rht_obj(ht, he))) rhashtable_compare(&arg, rht_obj(ht, he)))
continue; continue;
rcu_read_unlock(); return he;
return rht_obj(ht, he);
} }
/* Ensure we see any new tables. */ /* Ensure we see any new tables. */
...@@ -558,11 +545,59 @@ static inline void *rhashtable_lookup_fast( ...@@ -558,11 +545,59 @@ static inline void *rhashtable_lookup_fast(
tbl = rht_dereference_rcu(tbl->future_tbl, ht); tbl = rht_dereference_rcu(tbl->future_tbl, ht);
if (unlikely(tbl)) if (unlikely(tbl))
goto restart; goto restart;
rcu_read_unlock();
return NULL; return NULL;
} }
/**
* rhashtable_lookup - search hash table
* @ht: hash table
* @key: the pointer to the key
* @params: hash table parameters
*
* Computes the hash value for the key and traverses the bucket chain looking
* for a entry with an identical key. The first matching entry is returned.
*
* This must only be called under the RCU read lock.
*
* Returns the first entry on which the compare function returned true.
*/
static inline void *rhashtable_lookup(
struct rhashtable *ht, const void *key,
const struct rhashtable_params params)
{
struct rhash_head *he = __rhashtable_lookup(ht, key, params);
return he ? rht_obj(ht, he) : NULL;
}
/**
* rhashtable_lookup_fast - search hash table, without RCU read lock
* @ht: hash table
* @key: the pointer to the key
* @params: hash table parameters
*
* Computes the hash value for the key and traverses the bucket chain looking
* for a entry with an identical key. The first matching entry is returned.
*
* Only use this function when you have other mechanisms guaranteeing
* that the object won't go away after the RCU read lock is released.
*
* Returns the first entry on which the compare function returned true.
*/
static inline void *rhashtable_lookup_fast(
struct rhashtable *ht, const void *key,
const struct rhashtable_params params)
{
void *obj;
rcu_read_lock();
obj = rhashtable_lookup(ht, key, params);
rcu_read_unlock();
return obj;
}
/* Internal function, please use rhashtable_insert_fast() instead. This /* Internal function, please use rhashtable_insert_fast() instead. This
* function returns the existing element already in hashes in there is a clash, * function returns the existing element already in hashes in there is a clash,
* otherwise it returns an error via ERR_PTR(). * otherwise it returns an error via ERR_PTR().
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment