dm bufio: don't take the lock in dm_bufio_shrink_count
authorMikulas Patocka <mpatocka@redhat.com>
Wed, 23 Nov 2016 21:52:01 +0000 (16:52 -0500)
committerMike Snitzer <snitzer@redhat.com>
Thu, 8 Dec 2016 19:13:04 +0000 (14:13 -0500)
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>
drivers/md/dm-bufio.c

index b5d3428..9ef88f0 100644 (file)
@@ -1588,18 +1588,9 @@ dm_bufio_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
 static unsigned long
 dm_bufio_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
 {
-       struct dm_bufio_client *c;
-       unsigned long count;
-
-       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;
+       struct dm_bufio_client *c = container_of(shrink, struct dm_bufio_client, shrinker);
 
-       count = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY];
-       dm_bufio_unlock(c);
-       return count;
+       return ACCESS_ONCE(c->n_buffers[LIST_CLEAN]) + ACCESS_ONCE(c->n_buffers[LIST_DIRTY]);
 }
 
 /*