]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rhashtable: consolidate hash computation in rht_key_get_hash()
authorMykyta Yatsenko <yatsenko@meta.com>
Tue, 24 Feb 2026 19:29:54 +0000 (19:29 +0000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 7 Mar 2026 05:12:20 +0000 (14:12 +0900)
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>
include/linux/rhashtable.h

index 133ccb39137ab6da062c6dba994407bd25a65648..0480509a6339332491ca1adf6a17a1fe35c6928f 100644 (file)
@@ -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;