| From foo@baz Mon Sep 17 13:33:56 CEST 2018 |
| From: Stephen Hemminger <stephen@networkplumber.org> |
| Date: Thu, 13 Sep 2018 07:58:40 -0700 |
| Subject: rhashtable: add schedule points |
| To: davem@davemloft.net, gregkh@linuxfoundation.org |
| Cc: netdev@vger.kernel.org, stable@vger.kernel.org, edumazet@google.com |
| Message-ID: <20180913145902.17531-9-sthemmin@microsoft.com> |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| Rehashing and destroying large hash table takes a lot of time, |
| and happens in process context. It is safe to add cond_resched() |
| in rhashtable_rehash_table() and rhashtable_free_and_destroy() |
| |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Acked-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| (cherry picked from commit ae6da1f503abb5a5081f9f6c4a6881de97830f3e) |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| lib/rhashtable.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/lib/rhashtable.c |
| +++ b/lib/rhashtable.c |
| @@ -364,6 +364,7 @@ static int rhashtable_rehash_table(struc |
| err = rhashtable_rehash_chain(ht, old_hash); |
| if (err) |
| return err; |
| + cond_resched(); |
| } |
| |
| /* Publish the new table pointer. */ |
| @@ -1073,6 +1074,7 @@ void rhashtable_free_and_destroy(struct |
| for (i = 0; i < tbl->size; i++) { |
| struct rhash_head *pos, *next; |
| |
| + cond_resched(); |
| for (pos = rht_dereference(*rht_bucket(tbl, i), ht), |
| next = !rht_is_a_nulls(pos) ? |
| rht_dereference(pos->next, ht) : NULL; |