All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net 0/2 v2] rhashtable rehashing fixes
@ 2015-04-22  7:41 Thomas Graf
  2015-04-22  7:41 ` [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails Thomas Graf
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Thomas Graf @ 2015-04-22  7:41 UTC (permalink / raw)
  To: davem; +Cc: netdev, herbert, kaber

Some rhashtable rehashing bugs found while testing with the
next rhashtable self-test queued up for the next devel cycle:

https://github.com/tgraf/net-next/commits/rht

v2:
 - Moved schedule_work() call into rhashtable_insert_rehash()

Thomas Graf (2):
  rhashtable: Schedule async resize when sync realloc fails
  rhashtable: Do not schedule more than one rehash if we can't grow
    further

 lib/rhashtable.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

-- 
2.3.5

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails
  2015-04-22  7:41 [PATCH net 0/2 v2] rhashtable rehashing fixes Thomas Graf
@ 2015-04-22  7:41 ` Thomas Graf
  2015-04-22  7:43   ` Herbert Xu
  2015-04-22  7:41 ` [PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further Thomas Graf
  2015-04-22 18:21 ` [PATCH net 0/2 v2] rhashtable rehashing fixes David Miller
  2 siblings, 1 reply; 5+ messages in thread
From: Thomas Graf @ 2015-04-22  7:41 UTC (permalink / raw)
  To: davem; +Cc: netdev, herbert, kaber

When rhashtable_insert_rehash() fails with ENOMEM, this indicates that
we can't allocate the necessary memory in the current context but the
limits as set by the user would still allow to grow.

Thus attempt an async resize in the background where we can allocate
using GFP_KERNEL which is more likely to succeed. The insertion itself
will still fail to indicate pressure.

This fixes a bug where the table would never continue growing once the
utilization is above 100%.

Fixes: ccd57b1bd324 ("rhashtable: Add immediate rehash during insertion")
Signed-off-by: Thomas Graf <tgraf@suug.ch>
---
 lib/rhashtable.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 4898442..f648cfd 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -410,8 +410,13 @@ int rhashtable_insert_rehash(struct rhashtable *ht)
 		return -EBUSY;
 
 	new_tbl = bucket_table_alloc(ht, size, GFP_ATOMIC);
-	if (new_tbl == NULL)
+	if (new_tbl == NULL) {
+		/* Schedule async resize/rehash to try allocation
+		 * non-atomic context.
+		 */
+		schedule_work(&ht->run_work);
 		return -ENOMEM;
+	}
 
 	err = rhashtable_rehash_attach(ht, tbl, new_tbl);
 	if (err) {
-- 
2.3.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further
  2015-04-22  7:41 [PATCH net 0/2 v2] rhashtable rehashing fixes Thomas Graf
  2015-04-22  7:41 ` [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails Thomas Graf
@ 2015-04-22  7:41 ` Thomas Graf
  2015-04-22 18:21 ` [PATCH net 0/2 v2] rhashtable rehashing fixes David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: Thomas Graf @ 2015-04-22  7:41 UTC (permalink / raw)
  To: davem; +Cc: netdev, herbert, kaber

The current code currently only stops inserting rehashes into the
chain when no resizes are currently scheduled. As long as resizes
are scheduled and while inserting above the utilization watermark,
more and more rehashes will be scheduled.

This lead to a perfect DoS storm with thousands of rehashes
scheduled which lead to thousands of spinlocks to be taken
sequentially.

Instead, only allow either a series of resizes or a single rehash.
Drop any further rehashes and return -EBUSY.

Fixes: ccd57b1bd324 ("rhashtable: Add immediate rehash during insertion")
Signed-off-by: Thomas Graf <tgraf@suug.ch>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
---
 lib/rhashtable.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index f648cfd..b28df40 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -405,8 +405,8 @@ int rhashtable_insert_rehash(struct rhashtable *ht)
 
 	if (rht_grow_above_75(ht, tbl))
 		size *= 2;
-	/* More than two rehashes (not resizes) detected. */
-	else if (WARN_ON(old_tbl != tbl && old_tbl->size == size))
+	/* Do not schedule more than one rehash */
+	else if (old_tbl != tbl)
 		return -EBUSY;
 
 	new_tbl = bucket_table_alloc(ht, size, GFP_ATOMIC);
-- 
2.3.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails
  2015-04-22  7:41 ` [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails Thomas Graf
@ 2015-04-22  7:43   ` Herbert Xu
  0 siblings, 0 replies; 5+ messages in thread
From: Herbert Xu @ 2015-04-22  7:43 UTC (permalink / raw)
  To: Thomas Graf; +Cc: davem, netdev, kaber

On Wed, Apr 22, 2015 at 09:41:45AM +0200, Thomas Graf wrote:
> When rhashtable_insert_rehash() fails with ENOMEM, this indicates that
> we can't allocate the necessary memory in the current context but the
> limits as set by the user would still allow to grow.
> 
> Thus attempt an async resize in the background where we can allocate
> using GFP_KERNEL which is more likely to succeed. The insertion itself
> will still fail to indicate pressure.
> 
> This fixes a bug where the table would never continue growing once the
> utilization is above 100%.
> 
> Fixes: ccd57b1bd324 ("rhashtable: Add immediate rehash during insertion")
> Signed-off-by: Thomas Graf <tgraf@suug.ch>

Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
-- 
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net 0/2 v2] rhashtable rehashing fixes
  2015-04-22  7:41 [PATCH net 0/2 v2] rhashtable rehashing fixes Thomas Graf
  2015-04-22  7:41 ` [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails Thomas Graf
  2015-04-22  7:41 ` [PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further Thomas Graf
@ 2015-04-22 18:21 ` David Miller
  2 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2015-04-22 18:21 UTC (permalink / raw)
  To: tgraf; +Cc: netdev, herbert, kaber

From: Thomas Graf <tgraf@suug.ch>
Date: Wed, 22 Apr 2015 09:41:44 +0200

> Some rhashtable rehashing bugs found while testing with the
> next rhashtable self-test queued up for the next devel cycle:
> 
> https://github.com/tgraf/net-next/commits/rht
> 
> v2:
>  - Moved schedule_work() call into rhashtable_insert_rehash()

Series applied, thanks guys.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-04-22 18:21 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-22  7:41 [PATCH net 0/2 v2] rhashtable rehashing fixes Thomas Graf
2015-04-22  7:41 ` [PATCH net 1/2] rhashtable: Schedule async resize when sync realloc fails Thomas Graf
2015-04-22  7:43   ` Herbert Xu
2015-04-22  7:41 ` [PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further Thomas Graf
2015-04-22 18:21 ` [PATCH net 0/2 v2] rhashtable rehashing fixes David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.