| From foo@baz Mon Jul 23 08:24:46 CEST 2018 |
| From: Davidlohr Bueso <dave@stgolabs.net> |
| Date: Mon, 16 Jul 2018 13:26:13 -0700 |
| Subject: lib/rhashtable: consider param->min_size when setting initial table size |
| |
| From: Davidlohr Bueso <dave@stgolabs.net> |
| |
| [ Upstream commit 107d01f5ba10f4162c38109496607eb197059064 ] |
| |
| rhashtable_init() currently does not take into account the user-passed |
| min_size parameter unless param->nelem_hint is set as well. As such, |
| the default size (number of buckets) will always be HASH_DEFAULT_SIZE |
| even if the smallest allowed size is larger than that. Remediate this |
| by unconditionally calling into rounded_hashtable_size() and handling |
| things accordingly. |
| |
| Signed-off-by: Davidlohr Bueso <dbueso@suse.de> |
| Acked-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| lib/rhashtable.c | 17 +++++++++++------ |
| 1 file changed, 11 insertions(+), 6 deletions(-) |
| |
| --- a/lib/rhashtable.c |
| +++ b/lib/rhashtable.c |
| @@ -783,8 +783,16 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_stop); |
| |
| static size_t rounded_hashtable_size(const struct rhashtable_params *params) |
| { |
| - return max(roundup_pow_of_two(params->nelem_hint * 4 / 3), |
| - (unsigned long)params->min_size); |
| + size_t retsize; |
| + |
| + if (params->nelem_hint) |
| + retsize = max(roundup_pow_of_two(params->nelem_hint * 4 / 3), |
| + (unsigned long)params->min_size); |
| + else |
| + retsize = max(HASH_DEFAULT_SIZE, |
| + (unsigned long)params->min_size); |
| + |
| + return retsize; |
| } |
| |
| static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed) |
| @@ -841,8 +849,6 @@ int rhashtable_init(struct rhashtable *h |
| struct bucket_table *tbl; |
| size_t size; |
| |
| - size = HASH_DEFAULT_SIZE; |
| - |
| if ((!params->key_len && !params->obj_hashfn) || |
| (params->obj_hashfn && !params->obj_cmpfn)) |
| return -EINVAL; |
| @@ -869,8 +875,7 @@ int rhashtable_init(struct rhashtable *h |
| |
| ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE); |
| |
| - if (params->nelem_hint) |
| - size = rounded_hashtable_size(&ht->p); |
| + size = rounded_hashtable_size(&ht->p); |
| |
| /* The maximum (not average) chain length grows with the |
| * size of the hash table, at a rate of (log N)/(log log N). |