Skip to content

Commit f4ca8c5

Browse files
committed
btrfs: optimize split page write in btrfs_set_##bits
The helper write_extent_buffer is called to do write of the data spanning two extent buffer pages. As the size is known, we can do the write directly in two steps. This removes one function call and compiler can optimize memcpy as the sizes are known at compile time. Reviewed-by: Johannes Thumshirn <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent ba8a9a0 commit f4ca8c5

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

fs/btrfs/struct-funcs.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,18 +141,22 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
141141
{ \
142142
const unsigned long member_offset = (unsigned long)ptr + off; \
143143
const unsigned long oip = offset_in_page(member_offset); \
144+
const unsigned long idx = member_offset >> PAGE_SHIFT; \
145+
char *kaddr = page_address(eb->pages[idx]); \
144146
const int size = sizeof(u##bits); \
145-
__le##bits leres; \
147+
const int part = PAGE_SIZE - oip; \
148+
u8 lebytes[sizeof(u##bits)]; \
146149
\
147150
ASSERT(check_setget_bounds(eb, ptr, off, size)); \
148151
if (oip + size <= PAGE_SIZE) { \
149-
const unsigned long idx = member_offset >> PAGE_SHIFT; \
150-
char *kaddr = page_address(eb->pages[idx]); \
151152
put_unaligned_le##bits(val, kaddr + oip); \
152153
return; \
153154
} \
154-
leres = cpu_to_le##bits(val); \
155-
write_extent_buffer(eb, &leres, member_offset, size); \
155+
\
156+
put_unaligned_le##bits(val, lebytes); \
157+
memcpy(kaddr + oip, lebytes, part); \
158+
kaddr = page_address(eb->pages[idx + 1]); \
159+
memcpy(kaddr, lebytes + part, size - part); \
156160
}
157161

158162
DEFINE_BTRFS_SETGET_BITS(8)

0 commit comments

Comments
 (0)