Skip to content

Commit efb975a

Browse files
ying-xuedavem330
authored andcommitted
rhashtable: optimize rhashtable_lookup routine
Define an internal compare function and relevant compare argument, and then make use of rhashtable_lookup_compare() to lookup key in hash table, reducing duplicated code between rhashtable_lookup() and rhashtable_lookup_compare(). Signed-off-by: Ying Xue <[email protected]> Cc: Thomas Graf <[email protected]> Acked-by: Thomas Graf <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7c1b702 commit efb975a

File tree

1 file changed

+18
-23
lines changed

1 file changed

+18
-23
lines changed

lib/rhashtable.c

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,19 @@ bool rhashtable_remove(struct rhashtable *ht, struct rhash_head *obj)
612612
}
613613
EXPORT_SYMBOL_GPL(rhashtable_remove);
614614

615+
struct rhashtable_compare_arg {
616+
struct rhashtable *ht;
617+
const void *key;
618+
};
619+
620+
static bool rhashtable_compare(void *ptr, void *arg)
621+
{
622+
struct rhashtable_compare_arg *x = arg;
623+
struct rhashtable *ht = x->ht;
624+
625+
return !memcmp(ptr + ht->p.key_offset, x->key, ht->p.key_len);
626+
}
627+
615628
/**
616629
* rhashtable_lookup - lookup key in hash table
617630
* @ht: hash table
@@ -627,32 +640,14 @@ EXPORT_SYMBOL_GPL(rhashtable_remove);
627640
*/
628641
void *rhashtable_lookup(struct rhashtable *ht, const void *key)
629642
{
630-
const struct bucket_table *tbl, *old_tbl;
631-
struct rhash_head *he;
632-
u32 hash;
643+
struct rhashtable_compare_arg arg = {
644+
.ht = ht,
645+
.key = key,
646+
};
633647

634648
BUG_ON(!ht->p.key_len);
635649

636-
rcu_read_lock();
637-
old_tbl = rht_dereference_rcu(ht->tbl, ht);
638-
tbl = rht_dereference_rcu(ht->future_tbl, ht);
639-
hash = key_hashfn(ht, key, ht->p.key_len);
640-
restart:
641-
rht_for_each_rcu(he, tbl, rht_bucket_index(tbl, hash)) {
642-
if (memcmp(rht_obj(ht, he) + ht->p.key_offset, key,
643-
ht->p.key_len))
644-
continue;
645-
rcu_read_unlock();
646-
return rht_obj(ht, he);
647-
}
648-
649-
if (unlikely(tbl != old_tbl)) {
650-
tbl = old_tbl;
651-
goto restart;
652-
}
653-
654-
rcu_read_unlock();
655-
return NULL;
650+
return rhashtable_lookup_compare(ht, key, &rhashtable_compare, &arg);
656651
}
657652
EXPORT_SYMBOL_GPL(rhashtable_lookup);
658653

0 commit comments

Comments
 (0)