[PATCH net] rhashtable: use cond_resched()
From: Eric Dumazet <hidden>
Date: 2015-02-26 15:20:36
Subsystem:
library code, rhashtable, the rest · Maintainers:
Andrew Morton, Thomas Graf, Herbert Xu, Linus Torvalds
From: Eric Dumazet <hidden>
Date: 2015-02-26 15:20:36
Subsystem:
library code, rhashtable, the rest · Maintainers:
Andrew Morton, Thomas Graf, Herbert Xu, Linus Torvalds
From: Eric Dumazet <edumazet@google.com> If a hash table has 128 slots and 16384 elems, expand to 256 slots takes more than one second. For larger sets, a soft lockup is detected. Holding cpu for that long, even in a work queue is a show stopper for non preemptable kernels. cond_resched() at strategic points to allow process scheduler to reschedule us. Signed-off-by: Eric Dumazet <edumazet@google.com> --- lib/rhashtable.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index e3a04e4b3ec5..f3073fc600ed 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c@@ -17,6 +17,7 @@ #include <linux/kernel.h> #include <linux/init.h> #include <linux/log2.h> +#include <linux/sched.h> #include <linux/slab.h> #include <linux/vmalloc.h> #include <linux/mm.h>
@@ -414,6 +415,7 @@ int rhashtable_expand(struct rhashtable *ht) } } unlock_buckets(new_tbl, old_tbl, new_hash); + cond_resched(); } /* Unzip interleaved hash chains */
@@ -437,6 +439,7 @@ int rhashtable_expand(struct rhashtable *ht) complete = false; unlock_buckets(new_tbl, old_tbl, old_hash); + cond_resched(); } }
@@ -495,6 +498,7 @@ int rhashtable_shrink(struct rhashtable *ht) tbl->buckets[new_hash + new_tbl->size]); unlock_buckets(new_tbl, tbl, new_hash); + cond_resched(); } /* Publish the new, valid hash table */