]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: read eb folio index right before loops
authorDavid Sterba <dsterba@suse.com>
Tue, 6 Jan 2026 16:20:27 +0000 (17:20 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 Apr 2026 16:56:07 +0000 (18:56 +0200)
There are generic helpers to access extent buffer folio data of any
length, potentially iterating over a few of them. This is a slow path,
either we use the type based accessors or the eb folio allocation is
contiguous and we can use the memcpy/memcmp helpers.

The initialization of 'i' is done at the beginning though it may not be
needed. Move it right before the folio loop, this has minor effect on
generated code in __write_extent_buffer().

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index a0d61a6820ce73305cbb67749516e6b692409468..211a0aa03afbbe1845dc4e799774b290bbb92ae1 100644 (file)
@@ -4018,7 +4018,7 @@ void read_extent_buffer(const struct extent_buffer *eb, void *dstv,
        size_t cur;
        size_t offset;
        char *dst = (char *)dstv;
-       unsigned long i = get_eb_folio_index(eb, start);
+       unsigned long i;
 
        if (check_eb_range(eb, start, len)) {
                /*
@@ -4035,7 +4035,7 @@ void read_extent_buffer(const struct extent_buffer *eb, void *dstv,
        }
 
        offset = get_eb_offset_in_folio(eb, start);
-
+       i = get_eb_folio_index(eb, start);
        while (len > 0) {
                char *kaddr;
 
@@ -4058,7 +4058,7 @@ int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb,
        size_t cur;
        size_t offset;
        char __user *dst = (char __user *)dstv;
-       unsigned long i = get_eb_folio_index(eb, start);
+       unsigned long i;
        int ret = 0;
 
        WARN_ON(start > eb->len);
@@ -4071,7 +4071,7 @@ int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb,
        }
 
        offset = get_eb_offset_in_folio(eb, start);
-
+       i = get_eb_folio_index(eb, start);
        while (len > 0) {
                char *kaddr;
 
@@ -4099,7 +4099,7 @@ int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
        size_t offset;
        char *kaddr;
        char *ptr = (char *)ptrv;
-       unsigned long i = get_eb_folio_index(eb, start);
+       unsigned long i;
        int ret = 0;
 
        if (check_eb_range(eb, start, len))
@@ -4109,7 +4109,7 @@ int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
                return memcmp(ptrv, eb->addr + start, len);
 
        offset = get_eb_offset_in_folio(eb, start);
-
+       i = get_eb_folio_index(eb, start);
        while (len > 0) {
                cur = min(len, unit_size - offset);
                kaddr = folio_address(eb->folios[i]);
@@ -4169,7 +4169,7 @@ static void __write_extent_buffer(const struct extent_buffer *eb,
        size_t offset;
        char *kaddr;
        const char *src = (const char *)srcv;
-       unsigned long i = get_eb_folio_index(eb, start);
+       unsigned long i;
        /* For unmapped (dummy) ebs, no need to check their uptodate status. */
        const bool check_uptodate = !test_bit(EXTENT_BUFFER_UNMAPPED, &eb->bflags);
 
@@ -4185,7 +4185,7 @@ static void __write_extent_buffer(const struct extent_buffer *eb,
        }
 
        offset = get_eb_offset_in_folio(eb, start);
-
+       i = get_eb_folio_index(eb, start);
        while (len > 0) {
                if (check_uptodate)
                        assert_eb_folio_uptodate(eb, i);
@@ -4271,7 +4271,7 @@ void copy_extent_buffer(const struct extent_buffer *dst,
        size_t cur;
        size_t offset;
        char *kaddr;
-       unsigned long i = get_eb_folio_index(dst, dst_offset);
+       unsigned long i;
 
        if (check_eb_range(dst, dst_offset, len) ||
            check_eb_range(src, src_offset, len))
@@ -4281,6 +4281,7 @@ void copy_extent_buffer(const struct extent_buffer *dst,
 
        offset = get_eb_offset_in_folio(dst, dst_offset);
 
+       i = get_eb_folio_index(dst, dst_offset);
        while (len > 0) {
                assert_eb_folio_uptodate(dst, i);