]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.14.110/rhashtable-still-do-rehash-when-we-get-eexist.patch
Linux 4.9.167
[thirdparty/kernel/stable-queue.git] / releases / 4.14.110 / rhashtable-still-do-rehash-when-we-get-eexist.patch
1 From foo@baz Thu Mar 28 21:57:57 CET 2019
2 From: Herbert Xu <herbert@gondor.apana.org.au>
3 Date: Thu, 21 Mar 2019 09:39:52 +0800
4 Subject: rhashtable: Still do rehash when we get EEXIST
5
6 From: Herbert Xu <herbert@gondor.apana.org.au>
7
8 [ Upstream commit 408f13ef358aa5ad56dc6230c2c7deb92cf462b1 ]
9
10 As it stands if a shrink is delayed because of an outstanding
11 rehash, we will go into a rescheduling loop without ever doing
12 the rehash.
13
14 This patch fixes this by still carrying out the rehash and then
15 rescheduling so that we can shrink after the completion of the
16 rehash should it still be necessary.
17
18 The return value of EEXIST captures this case and other cases
19 (e.g., another thread expanded/rehashed the table at the same
20 time) where we should still proceed with the rehash.
21
22 Fixes: da20420f83ea ("rhashtable: Add nested tables")
23 Reported-by: Josh Elsasser <jelsasser@appneta.com>
24 Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
25 Tested-by: Josh Elsasser <jelsasser@appneta.com>
26 Signed-off-by: David S. Miller <davem@davemloft.net>
27 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
28 ---
29 lib/rhashtable.c | 8 ++++++--
30 1 file changed, 6 insertions(+), 2 deletions(-)
31
32 --- a/lib/rhashtable.c
33 +++ b/lib/rhashtable.c
34 @@ -459,8 +459,12 @@ static void rht_deferred_worker(struct w
35 else if (tbl->nest)
36 err = rhashtable_rehash_alloc(ht, tbl, tbl->size);
37
38 - if (!err)
39 - err = rhashtable_rehash_table(ht);
40 + if (!err || err == -EEXIST) {
41 + int nerr;
42 +
43 + nerr = rhashtable_rehash_table(ht);
44 + err = err ?: nerr;
45 + }
46
47 mutex_unlock(&ht->mutex);
48