diff options
author | 2025-07-01 19:23:52 +0200 | |
---|---|---|
committer | 2025-07-22 00:09:21 +0200 | |
commit | 1ed0f75d57aef3c447fbc78885c90421e40c1755 (patch) | |
tree | 701010d0a5b3b26ccbb23ac2ac7d2c68503fc4c0 | |
parent | btrfs: accessors: compile-time fast path for u8 (diff) | |
download | wireguard-linux-1ed0f75d57aef3c447fbc78885c90421e40c1755.tar.xz wireguard-linux-1ed0f75d57aef3c447fbc78885c90421e40c1755.zip |
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>
-rw-r--r-- | fs/btrfs/accessors.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/fs/btrfs/accessors.c b/fs/btrfs/accessors.c index 547e9f8fb87d..8df404b5f6a3 100644 --- a/fs/btrfs/accessors.c +++ b/fs/btrfs/accessors.c @@ -59,9 +59,15 @@ u##bits btrfs_get_##bits(const struct extent_buffer *eb, \ likely(sizeof(u##bits) <= part)) \ return get_unaligned_le##bits(kaddr + oil); \ \ - memcpy(lebytes, kaddr + oil, part); \ - kaddr = folio_address(eb->folios[idx + 1]); \ - memcpy(lebytes + part, kaddr, sizeof(u##bits) - part); \ + if (sizeof(u##bits) == 2) { \ + lebytes[0] = *(kaddr + oil); \ + kaddr = folio_address(eb->folios[idx + 1]); \ + lebytes[1] = *kaddr; \ + } else { \ + memcpy(lebytes, kaddr + oil, part); \ + kaddr = folio_address(eb->folios[idx + 1]); \ + memcpy(lebytes + part, kaddr, sizeof(u##bits) - part); \ + } \ return get_unaligned_le##bits(lebytes); \ } \ 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, \ put_unaligned_le##bits(val, kaddr + oil); \ return; \ } \ - \ put_unaligned_le##bits(val, lebytes); \ - memcpy(kaddr + oil, lebytes, part); \ - kaddr = folio_address(eb->folios[idx + 1]); \ - memcpy(kaddr, lebytes + part, sizeof(u##bits) - part); \ + if (sizeof(u##bits) == 2) { \ + *(kaddr + oil) = lebytes[0]; \ + kaddr = folio_address(eb->folios[idx + 1]); \ + *kaddr = lebytes[1]; \ + } else { \ + memcpy(kaddr + oil, lebytes, part); \ + kaddr = folio_address(eb->folios[idx + 1]); \ + memcpy(kaddr, lebytes + part, sizeof(u##bits) - part); \ + } \ } DEFINE_BTRFS_SETGET_BITS(8) |