All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: Nikolay Borisov <nborisov@suse.com>, Qu Wenruo <wqu@suse.com>,
	linux-btrfs@vger.kernel.org
Cc: Goldwyn Rodrigues <rgoldwyn@suse.com>
Subject: Re: [PATCH 19/32] btrfs: handle sectorsize < PAGE_SIZE case for extent buffer accessors
Date: Mon, 9 Nov 2020 13:49:07 +0800	[thread overview]
Message-ID: <13125d88-0c75-9c9e-0ae8-e393985695fa@gmx.com> (raw)
In-Reply-To: <d8eec47a-69c9-5173-1efb-0e7106068d70@suse.com>



On 2020/11/6 下午8:51, Nikolay Borisov wrote:
>
>
> On 3.11.20 г. 15:30 ч., Qu Wenruo wrote:
>> To support sectorsize < PAGE_SIZE case, we need to take extra care for
>> extent buffer accessors.
>>
>> Since sectorsize is smaller than PAGE_SIZE, one page can contain
>> multiple tree blocks, we must use eb->start to determine the real offset
>> to read/write for extent buffer accessors.
>>
>> This patch introduces two helpers to do these:
>> - get_eb_page_index()
>>   This is to calculate the index to access extent_buffer::pages.
>>   It's just a simple wrapper around "start >> PAGE_SHIFT".
>>
>>   For sectorsize == PAGE_SIZE case, nothing is changed.
>>   For sectorsize < PAGE_SIZE case, we always get index as 0, and
>>   the existing page shift works also fine.
>>
>> - get_eb_page_offset()
>>   This is to calculate the offset to access extent_buffer::pages.
>
> nit: This is the same sentence as for get_eb_page_index, I think you
> mean this calculates the offset in the page to start reading from.

Sorry, the for index, it's "to calculate the *index* to access", while
for this it's "to calculate the *offset* to access".

>
>>   This needs to take extent_buffer::start into consideration.
>>
>>   For sectorsize == PAGE_SIZE case, extent_buffer::start is always
>>   aligned to PAGE_SIZE, thus adding extent_buffer::start to
>>   offset_in_page() won't change the result.
>>   For sectorsize < PAGE_SIZE case, adding extent_buffer::start gives
>>   us the correct offset to access.
>>
>> This patch will touch the following parts to cover all extent buffer
>> accessors:
>>
>> - BTRFS_SETGET_HEADER_FUNCS()
>> - read_extent_buffer()
>> - read_extent_buffer_to_user()
>> - memcmp_extent_buffer()
>> - write_extent_buffer_chunk_tree_uuid()
>> - write_extent_buffer_fsid()
>> - write_extent_buffer()
>> - memzero_extent_buffer()
>> - copy_extent_buffer_full()
>> - copy_extent_buffer()
>> - memcpy_extent_buffer()
>> - memmove_extent_buffer()
>> - btrfs_get_token_##bits()
>> - btrfs_get_##bits()
>> - btrfs_set_token_##bits()
>> - btrfs_set_##bits()
>> - generic_bin_search()
>>
>
> <snip>
>
>> @@ -3314,6 +3315,39 @@ static inline void assertfail(const char *expr, const char* file, int line) { }
>>  #define ASSERT(expr)	(void)(expr)
>>  #endif
>>
>> +/*
>> + * Get the correct offset inside the page of extent buffer.
>> + *
>> + * Will handle both sectorsize == PAGE_SIZE and sectorsize < PAGE_SIZE cases.
>> + *
>> + * @eb:		The target extent buffer
>> + * @start:	The offset inside the extent buffer
>> + */
>> +static inline size_t get_eb_page_offset(const struct extent_buffer *eb,
>> +					unsigned long offset_in_eb)
>
> nit: Rename to offset, you already pass an extent buffer so it's natural
> that the offset pertain to this eb.

I intended to reduce the confusion to allow caller to know what to pass in.

But you're right, the "offset_in_eb" doesn't really bring anything.

Will rename them.

Thanks,
Qu
>
>> +{
>> +	/*
>> +	 * For sectorsize == PAGE_SIZE case, eb->start will always be aligned
>> +	 * to PAGE_SIZE, thus adding it won't cause any difference.
>> +	 *
>> +	 * For sectorsize < PAGE_SIZE, we must only read the data belongs to
>> +	 * the eb, thus we have to take the eb->start into consideration.
>> +	 */
>> +	return offset_in_page(offset_in_eb + eb->start);
>> +}
>> +
>> +static inline unsigned long get_eb_page_index(unsigned long offset_in_eb)
>
> nit: Rename to offset since "in_eb" doesn't bring any value just makes
> the variable's name somewhat awkward.
>> +{
>> +	/*
>> +	 * For sectorsize == PAGE_SIZE case, plain >> PAGE_SHIFT is enough.
>> +	 *
>> +	 * For sectorsize < PAGE_SIZE case, we only support 64K PAGE_SIZE,
>> +	 * and has ensured all tree blocks are contained in one page, thus
>> +	 * we always get index == 0.
>> +	 */
>> +	return offset_in_eb >> PAGE_SHIFT;
>> +}
>> +
>>  /*
>>   * Use that for functions that are conditionally exported for sanity tests but
>>   * otherwise static
>
> <snip>
>
>> @@ -5873,10 +5873,22 @@ void copy_extent_buffer_full(const struct extent_buffer *dst,
>>
>>  	ASSERT(dst->len == src->len);
>>
>> -	num_pages = num_extent_pages(dst);
>> -	for (i = 0; i < num_pages; i++)
>> -		copy_page(page_address(dst->pages[i]),
>> -				page_address(src->pages[i]));
>> +	if (dst->fs_info->sectorsize == PAGE_SIZE) {
>> +		num_pages = num_extent_pages(dst);
>> +		for (i = 0; i < num_pages; i++)
>> +			copy_page(page_address(dst->pages[i]),
>> +				  page_address(src->pages[i]));
>> +	} else {
>> +		unsigned long src_index = get_eb_page_index(0);
>> +		unsigned long dst_index = get_eb_page_index(0);
>
> nit: unsigned long src_index = 0, dst_index = 0; and remove the ASSERT()
> below
>
>> +		size_t src_offset = get_eb_page_offset(src, 0);
>> +		size_t dst_offset = get_eb_page_offset(dst, 0);
>> +
>> +		ASSERT(src_index == 0 && dst_index == 0);
>> +		memcpy(page_address(dst->pages[dst_index]) + dst_offset,
>> +		       page_address(src->pages[src_index]) + src_offset,
>> +		       src->len);
>> +	}
>>  }
>
> <snip>
>

  reply	other threads:[~2020-11-09  5:49 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-03 13:30 [PATCH 00/32] btrfs: preparation patches for subpage support Qu Wenruo
2020-11-03 13:30 ` [PATCH 01/32] btrfs: extent_io: remove the extent_start/extent_len for end_bio_extent_readpage() Qu Wenruo
2020-11-05  9:46   ` Nikolay Borisov
2020-11-05 10:15     ` Qu Wenruo
2020-11-05 10:32       ` Nikolay Borisov
2020-11-06  2:01         ` Qu Wenruo
2020-11-06  7:19           ` Qu Wenruo
2020-11-05 19:40   ` Josef Bacik
2020-11-06  1:52     ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 02/32] btrfs: extent_io: integrate page status update into endio_readpage_release_extent() Qu Wenruo
2020-11-05 10:26   ` Nikolay Borisov
2020-11-05 11:15     ` Qu Wenruo
2020-11-05 10:35   ` Nikolay Borisov
2020-11-05 11:25     ` Qu Wenruo
2020-11-05 19:34   ` Josef Bacik
2020-11-03 13:30 ` [PATCH 03/32] btrfs: extent_io: add lockdep_assert_held() for attach_extent_buffer_page() Qu Wenruo
2020-11-03 13:30 ` [PATCH 04/32] btrfs: extent_io: extract the btree page submission code into its own helper function Qu Wenruo
2020-11-05 10:47   ` Nikolay Borisov
2020-11-06 18:11     ` David Sterba
2020-11-03 13:30 ` [PATCH 05/32] btrfs: extent-io-tests: remove invalid tests Qu Wenruo
2020-11-03 13:30 ` [PATCH 06/32] btrfs: extent_io: calculate inline extent buffer page size based on page size Qu Wenruo
2020-11-05 12:54   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 07/32] btrfs: extent_io: make btrfs_fs_info::buffer_radix to take sector size devided values Qu Wenruo
2020-11-03 13:30 ` [PATCH 08/32] btrfs: extent_io: sink less common parameters for __set_extent_bit() Qu Wenruo
2020-11-05 13:35   ` Nikolay Borisov
2020-11-05 13:55     ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 09/32] btrfs: extent_io: sink less common parameters for __clear_extent_bit() Qu Wenruo
2020-11-03 13:30 ` [PATCH 10/32] btrfs: disk_io: grab fs_info from extent_buffer::fs_info directly for btrfs_mark_buffer_dirty() Qu Wenruo
2020-11-05 13:45   ` Nikolay Borisov
2020-11-05 13:49   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 11/32] btrfs: disk-io: make csum_tree_block() handle sectorsize smaller than page size Qu Wenruo
2020-11-06 18:58   ` David Sterba
2020-11-07  0:04     ` Qu Wenruo
2020-11-10 14:33       ` David Sterba
2020-11-11  0:08         ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 12/32] btrfs: disk-io: extract the extent buffer verification from btrfs_validate_metadata_buffer() Qu Wenruo
2020-11-05 13:57   ` Nikolay Borisov
2020-11-06 19:03     ` David Sterba
2020-11-09  6:44       ` Qu Wenruo
2020-11-10 14:37         ` David Sterba
2020-11-03 13:30 ` [PATCH 13/32] btrfs: disk-io: accept bvec directly for csum_dirty_buffer() Qu Wenruo
2020-11-05 14:13   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 14/32] btrfs: inode: make btrfs_readpage_end_io_hook() follow sector size Qu Wenruo
2020-11-05 14:28   ` Nikolay Borisov
2020-11-06 19:16     ` David Sterba
2020-11-06 19:20       ` David Sterba
2020-11-06 19:28   ` David Sterba
2020-11-03 13:30 ` [PATCH 15/32] btrfs: introduce a helper to determine if the sectorsize is smaller than PAGE_SIZE Qu Wenruo
2020-11-05 15:01   ` Nikolay Borisov
2020-11-05 22:52     ` Qu Wenruo
2020-11-06 17:28       ` David Sterba
2020-11-07  0:00         ` Qu Wenruo
2020-11-10 14:53           ` David Sterba
2020-11-11  1:34             ` Qu Wenruo
2020-11-11  2:21               ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 16/32] btrfs: extent_io: allow find_first_extent_bit() to find a range with exact bits match Qu Wenruo
2020-11-05 15:03   ` Nikolay Borisov
2020-11-05 22:55     ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 17/32] btrfs: extent_io: don't allow tree block to cross page boundary for subpage support Qu Wenruo
2020-11-06 11:54   ` Nikolay Borisov
2020-11-06 12:03     ` Nikolay Borisov
2020-11-06 13:25     ` Qu Wenruo
2020-11-06 14:04       ` Nikolay Borisov
2020-11-06 23:56         ` Qu Wenruo
2020-11-03 13:30 ` [PATCH 18/32] btrfs: extent_io: update num_extent_pages() to support subpage sized extent buffer Qu Wenruo
2020-11-06 12:09   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 19/32] btrfs: handle sectorsize < PAGE_SIZE case for extent buffer accessors Qu Wenruo
2020-11-06 12:51   ` Nikolay Borisov
2020-11-09  5:49     ` Qu Wenruo [this message]
2020-11-03 13:30 ` [PATCH 20/32] btrfs: disk-io: only clear EXTENT_LOCK bit for extent_invalidatepage() Qu Wenruo
2020-11-06 13:17   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 21/32] btrfs: extent-io: make type of extent_state::state to be at least 32 bits Qu Wenruo
2020-11-06 13:38   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 22/32] btrfs: file-item: use nodesize to determine whether we need readahead for btrfs_lookup_bio_sums() Qu Wenruo
2020-11-06 13:55   ` Nikolay Borisov
2020-11-03 13:30 ` [PATCH 23/32] btrfs: file-item: remove the btrfs_find_ordered_sum() call in btrfs_lookup_bio_sums() Qu Wenruo
2020-11-06 14:28   ` Nikolay Borisov
2020-11-03 13:31 ` [PATCH 24/32] btrfs: file-item: refactor btrfs_lookup_bio_sums() to handle out-of-order bvecs Qu Wenruo
2020-11-06 15:22   ` Nikolay Borisov
2020-11-03 13:31 ` [PATCH 25/32] btrfs: scrub: distinguish scrub_page from regular page Qu Wenruo
2020-11-03 13:31 ` [PATCH 26/32] btrfs: scrub: remove the @force parameter of scrub_pages() Qu Wenruo
2020-11-03 13:31 ` [PATCH 27/32] btrfs: scrub: use flexible array for scrub_page::csums Qu Wenruo
2020-11-09 17:44   ` David Sterba
2020-11-10  0:53     ` Qu Wenruo
2020-11-10 14:22       ` David Sterba
2020-11-03 13:31 ` [PATCH 28/32] btrfs: scrub: refactor scrub_find_csum() Qu Wenruo
2020-11-03 13:31 ` [PATCH 29/32] btrfs: scrub: introduce scrub_page::page_len for subpage support Qu Wenruo
2020-11-09 18:17   ` David Sterba
2020-11-10  0:54     ` Qu Wenruo
2020-11-09 18:25   ` David Sterba
2020-11-10  0:56     ` Qu Wenruo
2020-11-10 14:27       ` David Sterba
2020-11-03 13:31 ` [PATCH 30/32] btrfs: scrub: always allocate one full page for one sector for RAID56 Qu Wenruo
2020-11-03 13:31 ` [PATCH 31/32] btrfs: scrub: support subpage tree block scrub Qu Wenruo
2020-11-09 18:31   ` David Sterba
2020-11-03 13:31 ` [PATCH 32/32] btrfs: scrub: support subpage data scrub Qu Wenruo
2020-11-05 19:28 ` [PATCH 00/32] btrfs: preparation patches for subpage support Josef Bacik
2020-11-06  0:02   ` Qu Wenruo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=13125d88-0c75-9c9e-0ae8-e393985695fa@gmx.com \
    --to=quwenruo.btrfs@gmx.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=nborisov@suse.com \
    --cc=rgoldwyn@suse.com \
    --cc=wqu@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.