From: Qu Wenruo <quwenruo.btrfs@gmx.com>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>,
linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 1/2] btrfs: Convert defrag_prepare_one_page() to use a folio
Date: Sat, 9 Dec 2023 07:26:45 +1030 [thread overview]
Message-ID: <b9b91cd5-80be-41c0-a7fe-a64cbbcc6d85@gmx.com> (raw)
In-Reply-To: <20231208192725.1523194-1-willy@infradead.org>
On 2023/12/9 05:57, Matthew Wilcox (Oracle) wrote:
> Use a folio throughout defrag_prepare_one_page() to remove dozens of
> hidden calls to compound_head(). There is no support here for large
> folios; indeed, turn the existing check for PageCompound into a check
> for large folios.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Looks good to me.
Although some comments inlined below
> ---
> fs/btrfs/defrag.c | 53 ++++++++++++++++++++++++-----------------------
> 1 file changed, 27 insertions(+), 26 deletions(-)
>
> diff --git a/fs/btrfs/defrag.c b/fs/btrfs/defrag.c
> index a9a068af8d6e..17a13d3ed131 100644
> --- a/fs/btrfs/defrag.c
> +++ b/fs/btrfs/defrag.c
> @@ -868,13 +868,14 @@ static struct page *defrag_prepare_one_page(struct btrfs_inode *inode, pgoff_t i
> u64 page_start = (u64)index << PAGE_SHIFT;
> u64 page_end = page_start + PAGE_SIZE - 1;
> struct extent_state *cached_state = NULL;
> - struct page *page;
> + struct folio *folio;
> int ret;
>
> again:
> - page = find_or_create_page(mapping, index, mask);
> - if (!page)
> - return ERR_PTR(-ENOMEM);
> + folio = __filemap_get_folio(mapping, index,
> + FGP_LOCK | FGP_ACCESSED | FGP_CREAT, mask);
When I was (and still am) a newbie to the folio interfaces, the "__"
prefix is driving me away to use it.
Mind to change it in the future? Like adding a new
filemap_get_or_create_folio()?
> + if (IS_ERR(folio))
> + return &folio->page;
>
> /*
> * Since we can defragment files opened read-only, we can encounter
> @@ -884,16 +885,16 @@ static struct page *defrag_prepare_one_page(struct btrfs_inode *inode, pgoff_t i
> * executables that explicitly enable them, so this isn't very
> * restrictive.
> */
> - if (PageCompound(page)) {
> - unlock_page(page);
> - put_page(page);
> + if (folio_test_large(folio)) {
> + folio_unlock(folio);
> + folio_put(folio);
> return ERR_PTR(-ETXTBSY);
> }
>
> - ret = set_page_extent_mapped(page);
> + ret = set_page_extent_mapped(&folio->page);
With my recent patches, set_page_extent_mapped() is already using folio
interfaces, I guess it's time to finally change it to accept a folio.
> if (ret < 0) {
> - unlock_page(page);
> - put_page(page);
> + folio_unlock(folio);
> + folio_put(folio);
> return ERR_PTR(ret);
> }
>
> @@ -908,17 +909,17 @@ static struct page *defrag_prepare_one_page(struct btrfs_inode *inode, pgoff_t i
> if (!ordered)
> break;
>
> - unlock_page(page);
> + folio_unlock(folio);
> btrfs_start_ordered_extent(ordered);
> btrfs_put_ordered_extent(ordered);
> - lock_page(page);
> + folio_lock(folio);
> /*
> - * We unlocked the page above, so we need check if it was
> + * We unlocked the folio above, so we need check if it was
> * released or not.
> */
> - if (page->mapping != mapping || !PagePrivate(page)) {
> - unlock_page(page);
> - put_page(page);
> + if (folio->mapping != mapping || !folio->private) {
This folio->private check is not the same as PagePrivate(page) IIRC.
Isn't folio_test_private() more suitable here?
Thanks,
Qu
> + folio_unlock(folio);
> + folio_put(folio);
> goto again;
> }
> }
> @@ -927,21 +928,21 @@ static struct page *defrag_prepare_one_page(struct btrfs_inode *inode, pgoff_t i
> * Now the page range has no ordered extent any more. Read the page to
> * make it uptodate.
> */
> - if (!PageUptodate(page)) {
> - btrfs_read_folio(NULL, page_folio(page));
> - lock_page(page);
> - if (page->mapping != mapping || !PagePrivate(page)) {
> - unlock_page(page);
> - put_page(page);
> + if (!folio_test_uptodate(folio)) {
> + btrfs_read_folio(NULL, folio);
> + folio_lock(folio);
> + if (folio->mapping != mapping || !folio->private) {
> + folio_unlock(folio);
> + folio_put(folio);
> goto again;
> }
> - if (!PageUptodate(page)) {
> - unlock_page(page);
> - put_page(page);
> + if (!folio_test_uptodate(folio)) {
> + folio_unlock(folio);
> + folio_put(folio);
> return ERR_PTR(-EIO);
> }
> }
> - return page;
> + return &folio->page;
> }
>
> struct defrag_target_range {
next prev parent reply other threads:[~2023-12-08 20:57 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-08 19:27 [PATCH 1/2] btrfs: Convert defrag_prepare_one_page() to use a folio Matthew Wilcox (Oracle)
2023-12-08 19:27 ` [PATCH 2/2] btrfs: Use a folio array throughout the defrag process Matthew Wilcox (Oracle)
2023-12-08 21:14 ` Qu Wenruo
2023-12-08 21:24 ` Matthew Wilcox
2023-12-08 21:30 ` Qu Wenruo
2023-12-08 20:56 ` Qu Wenruo [this message]
2023-12-08 21:16 ` [PATCH 1/2] btrfs: Convert defrag_prepare_one_page() to use a folio Matthew Wilcox
2023-12-08 21:24 ` Qu Wenruo
-- strict thread matches above, loose matches on Subject: below --
2023-08-14 17:03 Matthew Wilcox (Oracle)
2023-08-17 12:25 ` 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=b9b91cd5-80be-41c0-a7fe-a64cbbcc6d85@gmx.com \
--to=quwenruo.btrfs@gmx.com \
--cc=clm@fb.com \
--cc=dsterba@suse.com \
--cc=josef@toxicpanda.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=willy@infradead.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