fs/buffer: avoid redundant lookup in getblk slowpath
authorDavidlohr Bueso <dave@stgolabs.net>
Thu, 15 May 2025 17:39:23 +0000 (10:39 -0700)
committerChristian Brauner <brauner@kernel.org>
Wed, 21 May 2025 07:34:29 +0000 (09:34 +0200)
__getblk_slow() already implies failing a first lookup
as the fastpath, so try to create the buffers immediately
and avoid the redundant lookup. This saves 5-10% of the
total cost/latency of the slowpath.

Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Link: https://lore.kernel.org/20250515173925.147823-3-dave@stgolabs.net
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/buffer.c

index 8563d94..23773b7 100644 (file)
@@ -1139,15 +1139,15 @@ __getblk_slow(struct block_device *bdev, sector_t block,
        for (;;) {
                struct buffer_head *bh;
 
+               if (!grow_buffers(bdev, block, size, gfp))
+                       return NULL;
+
                if (blocking)
                        bh = __find_get_block_nonatomic(bdev, block, size);
                else
                        bh = __find_get_block(bdev, block, size);
                if (bh)
                        return bh;
-
-               if (!grow_buffers(bdev, block, size, gfp))
-                       return NULL;
        }
 }