Re: [v2 PATCH 3/10] rhashtable: Allow hashfn to be unset
From: Thomas Graf <tgraf@suug.ch>
Date: 2015-03-23 09:58:44
On 03/23/15 at 08:12am, Herbert Xu wrote:
On Sun, Mar 22, 2015 at 12:32:57PM +0000, Thomas Graf wrote:quoted
Sure but why not just store key_len/4 in ht->p.key_len then if you opt in to jhash2() in rhashtable_init()?Because that breaks rhashtable_compare/memcmp.
Thanks. Didn't see that.
quoted
quoted
quoted
quoted
+ 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.If params->key_len is not constant, then params == ht->p.I must be missing something obvious. Who guarantees that? I can see that's true for the current callers but what prevents anybody from using rhashtable_lookup_fast() with a key length not known at compile time and pass it as rhashtable_params?They shouldn't be doing that. The whole point of this function is to have it inlined so all external callers of it should be supplying a constant parameter. We could add a __ variant that is only called by rhashtable if you like so we can enforce this in rhashtable_lookup_fast.
If you add such constraints it must be clearly documented. There is no way of figuring this out right now without reading the entire rhashtable code (and talking to you).
quoted
I still don't get this. Why do we fall back to jhash2() if params.key_len is set but not if only ht->p.key_len is set?Because if params.key_len is not set then we have no idea whether we should use jhash or jhash2 because ht->p.key_len cannot be known at compile time. This is only used by netfilter currently as it has a key-length set at run-time.
Sorry, still not getting this ;-) nft_hash sets key_len to set->klen and passes it to rhashtable_init(). rhashtable_init() should then fall back to jhash() or jhash2() if no hashfn is provided. Why is the logic in rht_key_hashfn() different? Actually, in which case is ht->p.hashfn not set in rht_key_hashfn()?