[PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further

2015-04-22 Thread Thomas Graf
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 tg...@suug.ch
Acked-by: Herbert Xu herb...@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

--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further

2015-04-21 Thread Thomas Graf
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 tg...@suug.ch
---
 lib/rhashtable.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 4898442..cb819ed 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

--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH net 2/2] rhashtable: Do not schedule more than one rehash if we can't grow further

2015-04-21 Thread Herbert Xu
On Tue, Apr 21, 2015 at 02:55:35PM +0200, Thomas Graf wrote:
 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 tg...@suug.ch

Acked-by: Herbert Xu herb...@gondor.apana.org.au
-- 
Email: Herbert Xu herb...@gondor.apana.org.au
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html