Skip to content

Commit 9bd129c

Browse files
committed
btrfs: accessors: compile-time fast path for u16
Reading/writing 2 bytes (u16) may need 2 folios to be written to, each time it's just one byte so using memcpy for that is an overkill. Add a branch for the split case so that memcpy is now used for u32 and u64. Another side effect is that the u16 types now don't need additional stack space, everything fits to registers. Stack usage is reduced: btrfs_get_16 -8 (32 -> 24) btrfs_set_16 -16 (32 -> 16) Code size reduction: text data bss dec hex filename 1454691 115665 16088 1586444 18350c pre/btrfs.ko 1454459 115665 16088 1586212 183424 post/btrfs.ko DELTA: -232 Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent db1da57 commit 9bd129c

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

fs/btrfs/accessors.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,15 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \
5959
likely(sizeof(u##bits) <= part)) \
6060
return get_unaligned_le##bits(kaddr + oil); \
6161
\
62-
memcpy(lebytes, kaddr + oil, part); \
63-
kaddr = folio_address(eb->folios[idx + 1]); \
64-
memcpy(lebytes + part, kaddr, sizeof(u##bits) - part); \
62+
if (sizeof(u##bits) == 2) { \
63+
lebytes[0] = *(kaddr + oil); \
64+
kaddr = folio_address(eb->folios[idx + 1]); \
65+
lebytes[1] = *kaddr; \
66+
} else { \
67+
memcpy(lebytes, kaddr + oil, part); \
68+
kaddr = folio_address(eb->folios[idx + 1]); \
69+
memcpy(lebytes + part, kaddr, sizeof(u##bits) - part); \
70+
} \
6571
return get_unaligned_le##bits(lebytes); \
6672
} \
6773
void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
@@ -84,11 +90,16 @@ void btrfs_set_##bits(const struct extent_buffer *eb, void *ptr, \
8490
put_unaligned_le##bits(val, kaddr + oil); \
8591
return; \
8692
} \
87-
\
8893
put_unaligned_le##bits(val, lebytes); \
89-
memcpy(kaddr + oil, lebytes, part); \
90-
kaddr = folio_address(eb->folios[idx + 1]); \
91-
memcpy(kaddr, lebytes + part, sizeof(u##bits) - part); \
94+
if (sizeof(u##bits) == 2) { \
95+
*(kaddr + oil) = lebytes[0]; \
96+
kaddr = folio_address(eb->folios[idx + 1]); \
97+
*kaddr = lebytes[1]; \
98+
} else { \
99+
memcpy(kaddr + oil, lebytes, part); \
100+
kaddr = folio_address(eb->folios[idx + 1]); \
101+
memcpy(kaddr, lebytes + part, sizeof(u##bits) - part); \
102+
} \
92103
}
93104

94105
DEFINE_BTRFS_SETGET_BITS(8)

0 commit comments

Comments
 (0)