]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
dm cache: optimize dirty bit checking with find_next_bit when resizing
authorMing-Hung Tsai <mtsai@redhat.com>
Tue, 22 Oct 2024 07:13:39 +0000 (15:13 +0800)
committerMikulas Patocka <mpatocka@redhat.com>
Mon, 4 Nov 2024 16:39:31 +0000 (17:39 +0100)
When shrinking the fast device, dm-cache iteratively searches for a
dirty bit among the cache blocks to be dropped, which is less efficient.
Use find_next_bit instead, as it is twice as fast as the iterative
approach with test_bit.

Signed-off-by: Ming-Hung Tsai <mtsai@redhat.com>
Fixes: f494a9c6b1b6 ("dm cache: cache shrinking support")
Cc: stable@vger.kernel.org
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Acked-by: Joe Thornber <thornber@redhat.com>
drivers/md/dm-cache-target.c

index 1fcd8c5c220e8b687b02a1fcc964d225e938dfb3..fa8ef2c32af8914339b156414123eaf992cf8730 100644 (file)
@@ -2911,14 +2911,14 @@ static bool can_resize(struct cache *cache, dm_cblock_t new_size)
        /*
         * We can't drop a dirty block when shrinking the cache.
         */
-       while (from_cblock(new_size) < from_cblock(cache->cache_size)) {
-               if (is_dirty(cache, new_size)) {
-                       DMERR("%s: unable to shrink cache; cache block %llu is dirty",
-                             cache_device_name(cache),
-                             (unsigned long long) from_cblock(new_size));
-                       return false;
-               }
-               new_size = to_cblock(from_cblock(new_size) + 1);
+       new_size = to_cblock(find_next_bit(cache->dirty_bitset,
+                                          from_cblock(cache->cache_size),
+                                          from_cblock(new_size)));
+       if (new_size != cache->cache_size) {
+               DMERR("%s: unable to shrink cache; cache block %llu is dirty",
+                     cache_device_name(cache),
+                     (unsigned long long) from_cblock(new_size));
+               return false;
        }
 
        return true;