Skip to content

Commit ba8a9a0

Browse files
committed
btrfs: optimize split page read in btrfs_get_token_##bits
The fallback path calls helper read_extent_buffer to do read of the data spanning two extent buffer pages. As the size is known, we can do the read directly in two steps. This removes one function call and compiler can optimize memcpy as the sizes are known at compile time. The cached token address is set to the second page. Reviewed-by: Johannes Thumshirn <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 84da071 commit ba8a9a0

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

fs/btrfs/struct-funcs.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
6666
const unsigned long idx = member_offset >> PAGE_SHIFT; \
6767
const unsigned long oip = offset_in_page(member_offset); \
6868
const int size = sizeof(u##bits); \
69-
__le##bits leres; \
69+
u8 lebytes[sizeof(u##bits)]; \
70+
const int part = PAGE_SIZE - oip; \
7071
\
7172
ASSERT(token); \
7273
ASSERT(token->kaddr); \
@@ -75,15 +76,16 @@ u##bits btrfs_get_token_##bits(struct btrfs_map_token *token, \
7576
member_offset + size <= token->offset + PAGE_SIZE) { \
7677
return get_unaligned_le##bits(token->kaddr + oip); \
7778
} \
78-
if (oip + size <= PAGE_SIZE) { \
79-
token->kaddr = page_address(token->eb->pages[idx]); \
80-
token->offset = idx << PAGE_SHIFT; \
79+
token->kaddr = page_address(token->eb->pages[idx]); \
80+
token->offset = idx << PAGE_SHIFT; \
81+
if (oip + size <= PAGE_SIZE) \
8182
return get_unaligned_le##bits(token->kaddr + oip); \
82-
} \
83+
\
84+
memcpy(lebytes, token->kaddr + oip, part); \
8385
token->kaddr = page_address(token->eb->pages[idx + 1]); \
8486
token->offset = (idx + 1) << PAGE_SHIFT; \
85-
read_extent_buffer(token->eb, &leres, member_offset, size); \
86-
return le##bits##_to_cpu(leres); \
87+
memcpy(lebytes + part, token->kaddr, size - part); \
88+
return get_unaligned_le##bits(lebytes); \
8789
} \
8890
u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
8991
const void *ptr, unsigned long off) \

0 commit comments

Comments
 (0)