All of lore.kernel.org
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: miklos@szeredi.hu, linux-fsdevel@vger.kernel.org,
	bernd.schubert@fastmail.fm, jefflexu@linux.alibaba.com,
	kernel-team@meta.com
Subject: Re: [PATCH v3 6/9] fuse: convert fuse_writepages_fill() to use a folio for its tmp page
Date: Mon, 26 Aug 2024 10:31:05 -0400	[thread overview]
Message-ID: <20240826143105.GD2393039@perftesting> (raw)
In-Reply-To: <CAJnrk1aU-iY+7v-b+=YJm_ajHFJjm2ZfsT_TwC2EJSy6zSn2uQ@mail.gmail.com>

On Fri, Aug 23, 2024 at 02:38:02PM -0700, Joanne Koong wrote:
> On Fri, Aug 23, 2024 at 12:03 PM Josef Bacik <josef@toxicpanda.com> wrote:
> >
> > On Fri, Aug 23, 2024 at 09:27:27AM -0700, Joanne Koong wrote:
> > > To pave the way for refactoring out the shared logic in
> > > fuse_writepages_fill() and fuse_writepage_locked(), this change converts
> > > the temporary page in fuse_writepages_fill() to use the folio API.
> > >
> > > This is similar to the change in e0887e095a80 ("fuse: Convert
> > > fuse_writepage_locked to take a folio"), which converted the tmp page in
> > > fuse_writepage_locked() to use the folio API.
> > >
> > > inc_node_page_state() is intentionally preserved here instead of
> > > converting to node_stat_add_folio() since it is updating the stat of the
> > > underlying page and to better maintain API symmetry with
> > > dec_node_page_stat() in fuse_writepage_finish_stat().
> > >
> > > No functional changes added.
> > >
> > > Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
> > > ---
> > >  fs/fuse/file.c | 14 +++++++-------
> > >  1 file changed, 7 insertions(+), 7 deletions(-)
> > >
> > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c
> > > index a51b0b085616..905b202a7acd 100644
> > > --- a/fs/fuse/file.c
> > > +++ b/fs/fuse/file.c
> > > @@ -2260,7 +2260,7 @@ static int fuse_writepages_fill(struct folio *folio,
> > >       struct inode *inode = data->inode;
> > >       struct fuse_inode *fi = get_fuse_inode(inode);
> > >       struct fuse_conn *fc = get_fuse_conn(inode);
> > > -     struct page *tmp_page;
> > > +     struct folio *tmp_folio;
> > >       int err;
> > >
> > >       if (wpa && fuse_writepage_need_send(fc, &folio->page, ap, data)) {
> > > @@ -2269,8 +2269,8 @@ static int fuse_writepages_fill(struct folio *folio,
> > >       }
> > >
> > >       err = -ENOMEM;
> > > -     tmp_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM);
> > > -     if (!tmp_page)
> > > +     tmp_folio = folio_alloc(GFP_NOFS | __GFP_HIGHMEM, 0);
> > > +     if (!tmp_folio)
> > >               goto out_unlock;
> > >
> > >       /*
> > > @@ -2290,7 +2290,7 @@ static int fuse_writepages_fill(struct folio *folio,
> > >               err = -ENOMEM;
> > >               wpa = fuse_writepage_args_alloc();
> > >               if (!wpa) {
> > > -                     __free_page(tmp_page);
> > > +                     folio_put(tmp_folio);
> > >                       goto out_unlock;
> > >               }
> > >               fuse_writepage_add_to_bucket(fc, wpa);
> > > @@ -2308,14 +2308,14 @@ static int fuse_writepages_fill(struct folio *folio,
> > >       }
> > >       folio_start_writeback(folio);
> > >
> > > -     copy_highpage(tmp_page, &folio->page);
> > > -     ap->pages[ap->num_pages] = tmp_page;
> > > +     folio_copy(tmp_folio, folio);
> > > +     ap->pages[ap->num_pages] = &tmp_folio->page;
> > >       ap->descs[ap->num_pages].offset = 0;
> > >       ap->descs[ap->num_pages].length = PAGE_SIZE;
> > >       data->orig_pages[ap->num_pages] = &folio->page;
> > >
> > >       inc_wb_stat(&inode_to_bdi(inode)->wb, WB_WRITEBACK);
> > > -     inc_node_page_state(tmp_page, NR_WRITEBACK_TEMP);
> > > +     inc_node_page_state(&tmp_folio->page, NR_WRITEBACK_TEMP);
> >
> > I *think* you can use
> >
> > node_stat_add_folio(tmp_folio, NR_WRITEBACK_TEMP);
> >
> > here instead of inc_node_page_state().  Thanks,
> 
> I was thinking inc_node_page_state() here would be better for
> preserving the API symmetry with the dec_node_page_state() function
> that gets called when the writeback gets finished (in
> fuse_writepage_finish_stat) - I don't think it's immediately obvious
> that node_stat_add_folio() and dec_node_page_state() are inverses of
> each other. I don't feel strongly about this though, so i'm happy to
> change this to node_stat_add_folio as well.

Ah yeah that's a good point, probably better to convert those in one shot so
everything is consistent.  Thanks,

Josef

  reply	other threads:[~2024-08-26 14:31 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-23 16:27 [PATCH v3 0/9] fuse: writeback clean up / refactoring Joanne Koong
2024-08-23 16:27 ` [PATCH v3 1/9] fuse: drop unused fuse_mount arg in fuse_writepage_finish() Joanne Koong
2024-08-23 16:27 ` [PATCH v3 2/9] fuse: refactor finished writeback stats updates into helper function Joanne Koong
2024-08-23 16:27 ` [PATCH v3 3/9] fuse: update stats for pages in dropped aux writeback list Joanne Koong
2024-08-23 16:27 ` [PATCH v3 4/9] fuse: clean up error handling in fuse_writepages() Joanne Koong
2024-08-23 16:27 ` [PATCH v3 5/9] fuse: move initialization of fuse_file to fuse_writepages() instead of in callback Joanne Koong
2024-08-23 18:59   ` Josef Bacik
2024-08-23 21:21     ` Joanne Koong
2024-08-23 16:27 ` [PATCH v3 6/9] fuse: convert fuse_writepages_fill() to use a folio for its tmp page Joanne Koong
2024-08-23 19:03   ` Josef Bacik
2024-08-23 21:38     ` Joanne Koong
2024-08-26 14:31       ` Josef Bacik [this message]
2024-08-23 16:27 ` [PATCH v3 7/9] fuse: move folio_start_writeback to after the allocations in fuse_writepage_locked() Joanne Koong
2024-08-23 16:27 ` [PATCH v3 8/9] fuse: move fuse file initialization to wpa allocation time Joanne Koong
2024-08-23 16:27 ` [PATCH v3 9/9] fuse: refactor out shared logic in fuse_writepages_fill() and fuse_writepage_locked() Joanne Koong
2024-08-23 19:24   ` Josef Bacik

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=20240826143105.GD2393039@perftesting \
    --to=josef@toxicpanda.com \
    --cc=bernd.schubert@fastmail.fm \
    --cc=jefflexu@linux.alibaba.com \
    --cc=joannelkoong@gmail.com \
    --cc=kernel-team@meta.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    /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.