Re: [v2 PATCH 3/10] rhashtable: Allow hashfn to be unset
From: Thomas Graf <tgraf@suug.ch>
Date: 2015-03-22 11:55:07
On 03/22/15 at 07:04pm, Herbert Xu wrote:
quoted hunk ↗ jump to hunk
@@ -134,6 +136,7 @@ struct rhashtable { struct bucket_table __rcu *tbl; atomic_t nelems; bool being_destroyed; + unsigned int key_len;
Why is this needed? It looks like you're always initializing this with ht->p.key_len
quoted hunk ↗ jump to hunk
struct rhashtable_params p; struct work_struct run_work; struct mutex mutex;@@ -199,12 +202,30 @@ static inline unsigned int rht_key_hashfn( struct rhashtable *ht, const struct bucket_table *tbl, const void *key, const struct rhashtable_params params) { - unsigned key_len = __builtin_constant_p(params.key_len) ? - (params.key_len ?: ht->p.key_len) : - params.key_len; + unsigned hash;
unsigned int In several places as well
+ if (!__builtin_constant_p(params.key_len)) + hash = ht->p.hashfn(key, ht->key_len, tbl->hash_rnd);
I don't understand this. It looks like you only consider params->key_len if it's constant.
+ else if (params.key_len) {
+ unsigned key_len = params.key_len;
+
+ if (params.hashfn)
+ hash = params.hashfn(key, key_len, tbl->hash_rnd);
+ else if (key_len & (sizeof(u32) - 1))
+ hash = jhash(key, key_len, tbl->hash_rnd);
+ else
+ hash = jhash2(key, key_len / sizeof(u32),
+ tbl->hash_rnd);
+ } else {
+ unsigned key_len = ht->p.key_len;
+
+ if (params.hashfn)
+ hash = params.hashfn(key, key_len, tbl->hash_rnd);
+ else
+ hash = jhash(key, key_len, tbl->hash_rnd);Why don't we opt-in to jhash2 in this case?