From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v3 0/8] btrfs: preparation patches for the incoming metadata folio conversion
Date: Sat, 15 Jul 2023 19:08:26 +0800 [thread overview]
Message-ID: <cover.1689418958.git.wqu@suse.com> (raw)
[CHANGELOG]
v2:
- Define write_extent_buffer_fsid/chunk_tree_uuid() as inline helpers
v3:
- Fix an undefined behavior bug in memcpy_extent_buffer()
Unlike the name, memcpy_extent_buffer() needs to handle overlapping
ranges, thus it calls copy_pages() which do overlap checks and switch
to memmove() when needed.
Here we introduce __write_extent_buffer() which allows us to switch
to go memmove() if needed.
- Also refactor memmove_extent_buffer()
Since we have __write_extent_buffer() which can go memmove(), it's
not hard to refactor memmove_extent_buffer().
But there is still a pitfall that we have to handle double page
boundaries as the old behavior, explained in the last patch.
- Add selftests on extent buffer memory operations
I have failed too many times refactoring memmove_extent_buffer(), the
wasted time should be a memorial for my stupidity.
[BACKGROUND]
Recently I'm checking on the feasibility on converting metadata handling
to go a folio based solution.
The best part of using a single folio for metadata is, we can get rid of
the complexity of cross-page handling, everything would be just a single
memory operation on a continuous memory range.
[PITFALLS]
One of the biggest problem for metadata folio conversion is, we still
need the current page based solution (or folios with order 0) as a
fallback solution when we can not get a high order folio.
In that case, there would be a hell to handle the four different
combinations (folio/folio, folio/page, page/folio, page/page) for extent
buffer helpers involving two extent buffers.
Although there are some new ideas on how to handle metadata memory (e.g.
go full vmallocated memory), reducing the open-coded memory handling for
metadata should always be a good start point.
[OBJECTIVE]
So this patchset is the preparation to reduce direct page operations for
metadata.
The patchset would do this mostly by concentrating the operations to use
the common helper, write_extent_buffer() and read_extent_buffer().
For bitmap operations it's much complex, thus this patchset refactor it
completely to go a 3 part solution:
- Handle the first byte
- Handle the byte aligned ranges
- Handle the last byte
This needs more complex testing (which I failed several times during
development) to prevent regression, thus extent buffer bitmap selftests
have been enhanced to catch all those new possible corner cases.
The same applies to memcpy_extent_buffer() and memmove_extent_buffer().
There are several pitfalls:
- memcpy_extent_buffer() name is not accurate
Unlike plain memcpy(), memcpy_extent_buffer() needs to handle
overlapping ranges.
- memmove_extent_buffer() must handle double page boundaries
Explained in the last patch, thus its refactor can not go the same
direction as memcpy_extent_buffer()
With too many times spent on debugging memmove_extent_buffer(), a new
selftest is added to prevent regression.
Qu Wenruo (8):
btrfs: tests: enhance extent buffer bitmap tests
btrfs: tests: add self tests for extent buffer memory operations
btrfs: refactor extent buffer bitmaps operations
btrfs: use write_extent_buffer() to implement
write_extent_buffer_*id()
btrfs: refactor main loop in copy_extent_buffer_full()
btrfs: copy all pages at once at the end of
btrfs_clone_extent_buffer()
btrfs: refactor main loop in memcpy_extent_buffer()
btrfs: refactor main loop in memmove_extent_buffer()
fs/btrfs/extent_io.c | 292 +++++++++++++----------------
fs/btrfs/extent_io.h | 19 +-
fs/btrfs/tests/extent-io-tests.c | 309 +++++++++++++++++++++++++------
3 files changed, 396 insertions(+), 224 deletions(-)
--
2.41.0
next reply other threads:[~2023-07-15 11:08 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-15 11:08 Qu Wenruo [this message]
2023-07-15 11:08 ` [PATCH v3 1/8] btrfs: tests: enhance extent buffer bitmap tests Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 2/8] btrfs: tests: add self tests for extent buffer memory operations Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 3/8] btrfs: refactor extent buffer bitmaps operations Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 4/8] btrfs: use write_extent_buffer() to implement write_extent_buffer_*id() Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 5/8] btrfs: refactor main loop in copy_extent_buffer_full() Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 6/8] btrfs: copy all pages at once at the end of btrfs_clone_extent_buffer() Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 7/8] btrfs: refactor main loop in memcpy_extent_buffer() Qu Wenruo
2023-07-15 11:08 ` [PATCH v3 8/8] btrfs: refactor main loop in memmove_extent_buffer() Qu Wenruo
2023-07-18 16:01 ` [PATCH v3 0/8] btrfs: preparation patches for the incoming metadata folio conversion David Sterba
2023-07-18 22:51 ` Qu Wenruo
2023-07-19 21:49 ` David Sterba
2023-07-20 15:06 ` David Sterba
2023-07-20 22:15 ` Qu Wenruo
2023-07-20 22:55 ` Qu Wenruo
2023-07-21 15:13 ` David Sterba
2023-07-27 18:27 ` David Sterba
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=cover.1689418958.git.wqu@suse.com \
--to=wqu@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox