Commit 3a324606 authored by Herbert Xu's avatar Herbert Xu Committed by David S. Miller

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: a998f712 ("rhashtable: Round up/down min/max_size to...")
Reported-by: default avatarWilliam Hua <william.hua@canonical.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 887dc9f2
...@@ -738,9 +738,6 @@ int rhashtable_init(struct rhashtable *ht, ...@@ -738,9 +738,6 @@ int rhashtable_init(struct rhashtable *ht,
if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT)) if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
return -EINVAL; return -EINVAL;
if (params->nelem_hint)
size = rounded_hashtable_size(params);
memset(ht, 0, sizeof(*ht)); memset(ht, 0, sizeof(*ht));
mutex_init(&ht->mutex); mutex_init(&ht->mutex);
spin_lock_init(&ht->lock); spin_lock_init(&ht->lock);
...@@ -760,6 +757,9 @@ int rhashtable_init(struct rhashtable *ht, ...@@ -760,6 +757,9 @@ int rhashtable_init(struct rhashtable *ht,
ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE); 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 /* The maximum (not average) chain length grows with the
* size of the hash table, at a rate of (log N)/(log log N). * 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 * The value of 16 is selected so that even if the hash
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment