]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.4.140/dm-bufio-don-t-take-the-lock-in-dm_bufio_shrink_count.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.4.140 / dm-bufio-don-t-take-the-lock-in-dm_bufio_shrink_count.patch
1 From d12067f428c037b4575aaeb2be00847fc214c24a Mon Sep 17 00:00:00 2001
2 From: Mikulas Patocka <mpatocka@redhat.com>
3 Date: Wed, 23 Nov 2016 16:52:01 -0500
4 Subject: dm bufio: don't take the lock in dm_bufio_shrink_count
5
6 From: Mikulas Patocka <mpatocka@redhat.com>
7
8 commit d12067f428c037b4575aaeb2be00847fc214c24a upstream.
9
10 dm_bufio_shrink_count() is called from do_shrink_slab to find out how many
11 freeable objects are there. The reported value doesn't have to be precise,
12 so we don't need to take the dm-bufio lock.
13
14 Suggested-by: David Rientjes <rientjes@google.com>
15 Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
16 Signed-off-by: Mike Snitzer <snitzer@redhat.com>
17 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18
19 ---
20 drivers/md/dm-bufio.c | 16 ++++------------
21 1 file changed, 4 insertions(+), 12 deletions(-)
22
23 --- a/drivers/md/dm-bufio.c
24 +++ b/drivers/md/dm-bufio.c
25 @@ -1574,19 +1574,11 @@ dm_bufio_shrink_scan(struct shrinker *sh
26 static unsigned long
27 dm_bufio_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
28 {
29 - struct dm_bufio_client *c;
30 - unsigned long count;
31 - unsigned long retain_target;
32 + struct dm_bufio_client *c = container_of(shrink, struct dm_bufio_client, shrinker);
33 + unsigned long count = READ_ONCE(c->n_buffers[LIST_CLEAN]) +
34 + READ_ONCE(c->n_buffers[LIST_DIRTY]);
35 + unsigned long retain_target = get_retain_buffers(c);
36
37 - c = container_of(shrink, struct dm_bufio_client, shrinker);
38 - if (sc->gfp_mask & __GFP_FS)
39 - dm_bufio_lock(c);
40 - else if (!dm_bufio_trylock(c))
41 - return 0;
42 -
43 - count = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY];
44 - retain_target = get_retain_buffers(c);
45 - dm_bufio_unlock(c);
46 return (count < retain_target) ? 0 : (count - retain_target);
47 }
48