| From d12067f428c037b4575aaeb2be00847fc214c24a Mon Sep 17 00:00:00 2001 |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| Date: Wed, 23 Nov 2016 16:52:01 -0500 |
| Subject: dm bufio: don't take the lock in dm_bufio_shrink_count |
| |
| From: Mikulas Patocka <mpatocka@redhat.com> |
| |
| commit d12067f428c037b4575aaeb2be00847fc214c24a upstream. |
| |
| dm_bufio_shrink_count() is called from do_shrink_slab to find out how many |
| freeable objects are there. The reported value doesn't have to be precise, |
| so we don't need to take the dm-bufio lock. |
| |
| Suggested-by: David Rientjes <rientjes@google.com> |
| Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-bufio.c | 16 ++++------------ |
| 1 file changed, 4 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/md/dm-bufio.c |
| +++ b/drivers/md/dm-bufio.c |
| @@ -1574,19 +1574,11 @@ dm_bufio_shrink_scan(struct shrinker *sh |
| static unsigned long |
| dm_bufio_shrink_count(struct shrinker *shrink, struct shrink_control *sc) |
| { |
| - struct dm_bufio_client *c; |
| - unsigned long count; |
| - unsigned long retain_target; |
| + struct dm_bufio_client *c = container_of(shrink, struct dm_bufio_client, shrinker); |
| + unsigned long count = READ_ONCE(c->n_buffers[LIST_CLEAN]) + |
| + READ_ONCE(c->n_buffers[LIST_DIRTY]); |
| + unsigned long retain_target = get_retain_buffers(c); |
| |
| - c = container_of(shrink, struct dm_bufio_client, shrinker); |
| - if (sc->gfp_mask & __GFP_FS) |
| - dm_bufio_lock(c); |
| - else if (!dm_bufio_trylock(c)) |
| - return 0; |
| - |
| - count = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY]; |
| - retain_target = get_retain_buffers(c); |
| - dm_bufio_unlock(c); |
| return (count < retain_target) ? 0 : (count - retain_target); |
| } |
| |