Skip to contentSkip to conversation

rhashtable: Always allocate at least one bucket lock

PATCH In review William Hua 3 participants 5 messages Dec 15, 2015 – Dec 16, 2015

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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
index a54ff89..1b1b5b2 100644
@@ -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
maintainer
#1 lore raw
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.

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
#2 lore raw
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.

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.

maintainer
#3 lore raw

rhashtable: 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_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...")
lib/rhashtable.c +3 -3
index 1c624db..9a40963 100644
@@ -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
maintainer
#4 lore raw

Re: 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_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.

Quoted 3 lines
Fixes a998f712f77e ("rhashtable: Round up/down min/max_size to...")

Applied and queued up for -stable, thanks!