summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorMykyta Yatsenko <yatsenko@meta.com>2026-02-24 22:29:54 +0300
committerHerbert Xu <herbert@gondor.apana.org.au>2026-03-07 08:12:20 +0300
commitc9429bf56405a326845a8a35357b5bdf1dc4558c (patch)
treefe1de9364fbaec5e99dce19ead77667fe890042f /include/linux
parent68e96c97369e63414c2e02d1dcb92680ac60cd2f (diff)
downloadlinux-c9429bf56405a326845a8a35357b5bdf1dc4558c.tar.xz
rhashtable: consolidate hash computation in rht_key_get_hash()
The else-if and else branches in rht_key_get_hash() both compute a hash using either params.hashfn or jhash, differing only in the source of key_len (params.key_len vs ht->p.key_len). Merge the two branches into one by using the ternary `params.key_len ?: ht->p.key_len` to select the key length, removing the duplicated logic. This also improves the performance of the else branch which previously always used jhash and never fell through to jhash2. This branch is going to be used by BPF resizable hashmap, which wraps rhashtable: https://lore.kernel.org/bpf/20260205-rhash-v1-0-30dd6d63c462@meta.com/ Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/rhashtable.h13
1 files changed, 3 insertions, 10 deletions
diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h
index 133ccb39137a..0480509a6339 100644
--- a/include/linux/rhashtable.h
+++ b/include/linux/rhashtable.h
@@ -129,10 +129,10 @@ static __always_inline unsigned int rht_key_get_hash(struct rhashtable *ht,
unsigned int hash;
/* params must be equal to ht->p if it isn't constant. */
- if (!__builtin_constant_p(params.key_len))
+ if (!__builtin_constant_p(params.key_len)) {
hash = ht->p.hashfn(key, ht->key_len, hash_rnd);
- else if (params.key_len) {
- unsigned int key_len = params.key_len;
+ } else {
+ unsigned int key_len = params.key_len ? : ht->p.key_len;
if (params.hashfn)
hash = params.hashfn(key, key_len, hash_rnd);
@@ -140,13 +140,6 @@ static __always_inline unsigned int rht_key_get_hash(struct rhashtable *ht,
hash = jhash(key, key_len, hash_rnd);
else
hash = jhash2(key, key_len / sizeof(u32), hash_rnd);
- } else {
- unsigned int key_len = ht->p.key_len;
-
- if (params.hashfn)
- hash = params.hashfn(key, key_len, hash_rnd);
- else
- hash = jhash(key, key_len, hash_rnd);
}
return hash;