rhashtable: Always allocate at least one bucket lock
Subsystems (4)
PATCH 1/1 rhashtable: Always allocate at least one bucket lock
No bucket locks are allocated when an rhashtable is initialized with fewer than two elements. In this special case, we should allocate at least one to prevent a segfault.
--- lib/rhashtable.c | 3 +++ 1 file changed, 3 insertions(+)
lib/rhashtable.c +3 -0
@@ -76,6 +76,9 @@ static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl,/* Never allocate more than 0.5 locks per bucket */ size = min_t(unsigned int, size, tbl->size >> 1); +/* Always allocate at least one lock */ + size = max_t(unsigned int, size, 1); +if (sizeof (spinlock_t) !=0 ) {#ifdef CONFIG_NUMA if (size * sizeof(spinlock_t) > PAGE_SIZE &&
Signature · 1 line
2.6.4
Herbert Xu
maintainerQuoted 5 lines · William Hua
No bucket locks are allocated when an rhashtable is initialized with fewer than two elements. In this special case, we should allocate at least one to prevent a segfault.
Signed-off-by William Hua <[email protected]>
Huh? The minimum hash table size is 4. How are you getting an rhashtable that's smaller than the required minimum?
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
Quoted 9 lines · Herbert Xu
Quoted 5 lines · William Hua
No bucket locks are allocated when an rhashtable is initialized with fewer than two elements. In this special case, we should allocate at least one to prevent a segfault.
Signed-off-by William Hua <[email protected]>Huh? The minimum hash table size is 4. How are you getting an rhashtable that's smaller than the required minimum?
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.
Herbert Xu
maintainerrhashtable: Enforce minimum size on initial hash table
Quoted 5 lines · William Hua
I wasn't aware there was an enforced minimum size. I simply set the
nelem_hintin therhastable_paramsstruct 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.
lib/rhashtable.c +3 -3
@@ -739,9 +737,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));mutex_init (&ht->mutex);spin_lock_init (&ht->lock);
@@ -761,6 +756,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
Signature · 3 lines
Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
David Miller
maintainerRe: rhashtable: Enforce minimum size on initial hash table
From: Herbert Xu <[email protected]>
Date: Wed, 16 Dec 2015 18:13:14 +0800
Quoted 16 lines
Quoted 5 lines · William Hua
I wasn't aware there was an enforced minimum size. I simply set the
nelem_hintin therhastable_paramsstruct 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.
Quoted 3 lines
Fixes a998f712f77e ("rhashtable: Round up/down min/max_size to...")Reported-by William Hua <[email protected]>Signed-off-by Herbert Xu <[email protected]>
Applied and queued up for -stable, thanks!