From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v3 0/5] btrfs: defrag: don't waste CPU time on non-target extent
Date: Sat, 5 Feb 2022 13:41:01 +0800 [thread overview]
Message-ID: <cover.1644039494.git.wqu@suse.com> (raw)
In the rework of btrfs_defrag_file() one core idea is to defrag cluster
by cluster, thus we can have a better layered code structure, just like
what we have now:
btrfs_defrag_file()
|- defrag_one_cluster()
|- defrag_one_range()
|- defrag_one_locked_range()
But there is a catch, btrfs_defrag_file() just moves the cluster to the
next cluster, never considering cases like the current extent is already
too large, we can skip to its end directly.
This increases CPU usage on very large but not fragmented files.
Fix the behavior in defrag_one_cluster() that, defrag_collect_targets()
will reports where next search should start from.
If the current extent is not a target at all, then we can jump to the
end of that non-target extent to save time.
To get the missing optimization, also introduce a new structure,
btrfs_defrag_ctrl, so we don't need to pass things like @newer_than and
@max_to_defrag around.
This also remove weird behaviors like reusing range::start for next
search location.
And since we need to convert old btrfs_ioctl_defrag_range_args to newer
btrfs_defrag_ctrl, also do extra sanity check in the converting
function.
Such cleanup will also bring us closer to expose these extra policy
parameters in future enhanced defrag ioctl interface.
(Unfortunately, the reserved space of the existing defrag ioctl is not
large enough to contain them all)
Changelog:
v2:
- Rebased to lastest misc-next
Just one small conflict with static_assert() update.
And this time only those patches are rebased to misc-next, thus it may
cause conflicts with fixes for defrag_check_next_extent() in the
future.
- Several grammar fixes
- Report accurate btrfs_defrag_ctrl::sectors_defragged
This is inspired by a comment from Filipe that the skip check
should be done in the defrag_collect_targets() call inside
defrag_one_range().
This results a new patch in v2.
- Change the timing of btrfs_defrag_ctrl::last_scanned update
Now it's updated inside defrag_one_range(), which will give
us an accurate view, unlike the previous call site in
defrag_one_cluster().
- Don't change the timing of extent threshold.
- Rename @last_target to @last_is_target in defrag_collect_targets()
v3:
- Add Reviewed-by tags
- Fix a wrong value in commit message of the 1st patch
- Make @orig_start const for the 3rd patch
- Fix a missing word "skip" in the 5th patch
- Remove one unnecessary assignment in the 5th patch
As we don't return the defragged sectors to user space.
Qu Wenruo (5):
btrfs: uapi: introduce BTRFS_DEFRAG_RANGE_MASK for later sanity check
btrfs: defrag: introduce btrfs_defrag_ctrl structure for later usage
btrfs: defrag: use btrfs_defrag_ctrl to replace
btrfs_ioctl_defrag_range_args for btrfs_defrag_file()
btrfs: defrag: make btrfs_defrag_file() to report accurate number of
defragged sectors
btrfs: defrag: allow defrag_one_cluster() to skip large extent which
is not a target
fs/btrfs/ctree.h | 22 +++-
fs/btrfs/file.c | 17 ++-
fs/btrfs/ioctl.c | 219 ++++++++++++++++++++++---------------
include/uapi/linux/btrfs.h | 6 +-
4 files changed, 163 insertions(+), 101 deletions(-)
--
2.35.0
next reply other threads:[~2022-02-05 5:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-05 5:41 Qu Wenruo [this message]
2022-02-05 5:41 ` [PATCH v3 1/5] btrfs: uapi: introduce BTRFS_DEFRAG_RANGE_MASK for later sanity check Qu Wenruo
2022-02-05 5:41 ` [PATCH v3 2/5] btrfs: defrag: introduce btrfs_defrag_ctrl structure for later usage Qu Wenruo
2022-02-05 5:41 ` [PATCH v3 3/5] btrfs: defrag: use btrfs_defrag_ctrl to replace btrfs_ioctl_defrag_range_args for btrfs_defrag_file() Qu Wenruo
2022-02-05 5:41 ` [PATCH v3 4/5] btrfs: defrag: make btrfs_defrag_file() to report accurate number of defragged sectors Qu Wenruo
2022-02-05 5:41 ` [PATCH v3 5/5] btrfs: defrag: allow defrag_one_cluster() to skip large extent which is not a target Qu Wenruo
2022-02-08 22:09 ` [PATCH v3 0/5] btrfs: defrag: don't waste CPU time on non-target extent David Sterba
2022-02-09 0:17 ` Qu Wenruo
2022-02-09 15:19 ` David Sterba
2022-02-10 0:33 ` Qu Wenruo
2022-02-10 14:26 ` David Sterba
2022-02-10 16:52 ` David Sterba
2022-02-11 0:42 ` 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=cover.1644039494.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 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.