diff options
author | Eric Dumazet <edumazet@google.com> | 2018-03-31 15:58:48 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-31 23:25:39 -0400 |
commit | ae6da1f503abb5a5081f9f6c4a6881de97830f3e (patch) | |
tree | 4eea8b062aaa689b2ffe74372acd4377f32e1c0d | |
parent | 483a6e4fa055123142d8956866fe2aa9c98d546d (diff) |
rhashtable: add schedule points
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>
-rw-r--r-- | lib/rhashtable.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index 47de025b6245..2b2b79974b61 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c | |||
@@ -333,6 +333,7 @@ static int rhashtable_rehash_table(struct rhashtable *ht) | |||
333 | err = rhashtable_rehash_chain(ht, old_hash); | 333 | err = rhashtable_rehash_chain(ht, old_hash); |
334 | if (err) | 334 | if (err) |
335 | return err; | 335 | return err; |
336 | cond_resched(); | ||
336 | } | 337 | } |
337 | 338 | ||
338 | /* Publish the new table pointer. */ | 339 | /* Publish the new table pointer. */ |
@@ -1112,6 +1113,7 @@ void rhashtable_free_and_destroy(struct rhashtable *ht, | |||
1112 | for (i = 0; i < tbl->size; i++) { | 1113 | for (i = 0; i < tbl->size; i++) { |
1113 | struct rhash_head *pos, *next; | 1114 | struct rhash_head *pos, *next; |
1114 | 1115 | ||
1116 | cond_resched(); | ||
1115 | for (pos = rht_dereference(*rht_bucket(tbl, i), ht), | 1117 | for (pos = rht_dereference(*rht_bucket(tbl, i), ht), |
1116 | next = !rht_is_a_nulls(pos) ? | 1118 | next = !rht_is_a_nulls(pos) ? |
1117 | rht_dereference(pos->next, ht) : NULL; | 1119 | rht_dereference(pos->next, ht) : NULL; |