Commit b8aa3371 authored by David Sterba's avatar David Sterba
Browse files

btrfs: read eb folio index right before loops



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: default avatarBoris Burkov <boris@bur.io>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent aae90421
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -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);