diff options
authorHerbert Xu <herbert@gondor.apana.org.au>2015-12-16 18:13:14 +0800
committerDavid S. Miller <davem@davemloft.net>2015-12-16 10:44:08 -0500
commit3a324606bbabfc30084ce9d08169910773ba9a92 (patch)
parent887dc9f2cef6e98dcccf807da5e6faf4f60ba483 (diff)
rhashtable: Enforce minimum size on initial hash table
William Hua <william.hua@canonical.com> wrote: > > I wasn't aware there was an enforced minimum size. I simply set the > nelem_hint in the rhastable_params struct to 1, expecting it to grow as > needed. This caused a segfault afterwards when trying to insert an > element. OK we're doing the size computation before we enforce the limit on min_size. ---8<--- We need to do the initial hash table size computation after we have obtained the correct min_size/max_size parameters. Otherwise we may end up with a hash table whose size is outside the allowed envelope. Fixes: a998f712f77e ("rhashtable: Round up/down min/max_size to...") Reported-by: William Hua <william.hua@canonical.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 2ff7ed91663a..a98e71db7dd2 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -738,9 +738,6 @@ int rhashtable_init(struct rhashtable *ht,
if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
return -EINVAL;
- if (params->nelem_hint)
- size = rounded_hashtable_size(params);
memset(ht, 0, sizeof(*ht));
@@ -760,6 +757,9 @@ int rhashtable_init(struct rhashtable *ht,
ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE);
+ if (params->nelem_hint)
+ 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).
* The value of 16 is selected so that even if the hash