| From foo@baz Tue Oct 16 18:12:46 CEST 2018 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| Date: Wed, 10 Oct 2018 12:29:55 -0700 |
| Subject: rhashtable: add schedule points |
| To: netdev@vger.kernel.org |
| Cc: davem@davemloft.net, gregkh@linuxfoundation.org, stable@vger.kernel.org, edumazet@google.com, sthemmin@microsoft.com |
| Message-ID: <20181010193017.25221-8-f.fainelli@gmail.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 | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/lib/rhashtable.c |
| +++ b/lib/rhashtable.c |
| @@ -251,8 +251,10 @@ static int rhashtable_rehash_table(struc |
| if (!new_tbl) |
| return 0; |
| |
| - for (old_hash = 0; old_hash < old_tbl->size; old_hash++) |
| + for (old_hash = 0; old_hash < old_tbl->size; old_hash++) { |
| rhashtable_rehash_chain(ht, old_hash); |
| + cond_resched(); |
| + } |
| |
| /* Publish the new table pointer. */ |
| rcu_assign_pointer(ht->tbl, new_tbl); |
| @@ -993,6 +995,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(tbl->buckets[i], ht), |
| next = !rht_is_a_nulls(pos) ? |
| rht_dereference(pos->next, ht) : NULL; |