From: Christoph Hellwig <hch@infradead.org>
To: Matthew Wilcox <willy@infradead.org>
Cc: Christoph Hellwig <hch@infradead.org>,
linux-mm@kvack.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, Jan Kara <jack@suse.com>,
David Howells <dhowells@redhat.com>
Subject: Re: [PATCH 09/12] writeback: Factor writeback_iter_next() out of write_cache_pages()
Date: Tue, 27 Jun 2023 09:28:28 -0700 [thread overview]
Message-ID: <ZJsOLJLtc+SRUU/L@infradead.org> (raw)
In-Reply-To: <ZJsAxVRZSEvdmlfB@casper.infradead.org>
On Tue, Jun 27, 2023 at 04:31:17PM +0100, Matthew Wilcox wrote:
> It makes the callers neater. Compare:
>
> if (!folio)
> return writeback_finish(mapping, wbc, false);
> vs
> if (!folio) {
> writeback_finish(mapping, wbc, false);
> return NULL;
> }
>
> Similarly for the other two callers.
Not sure I agree. See my quickly cooked up patch below. But in the
end this completely superficial and I won't complain, do it the way
your prefer.
>
> > > + if (error == AOP_WRITEPAGE_ACTIVATE) {
> > > + folio_unlock(folio);
> > > + error = 0;
> >
> > Note there really shouldn't be any need for this in outside of the
> > legacy >writepage case. But it might make sense to delay the removal
> > until after ->writepage is gone to avoid bugs in conversions.
>
> ext4_journalled_writepage_callback() still returns
> AOP_WRITEPAGE_ACTIVATE, and that's used by a direct call to
> write_cache_pages().
Yeah. But that could trivially do the open coded unlock_page.
But probably not worth mixing into this series.
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 55832679af2194..07bbbc0dec4d00 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2360,7 +2360,7 @@ void tag_pages_for_writeback(struct address_space *mapping,
}
EXPORT_SYMBOL(tag_pages_for_writeback);
-static struct folio *writeback_finish(struct address_space *mapping,
+static void writeback_finish(struct address_space *mapping,
struct writeback_control *wbc, bool done)
{
folio_batch_release(&wbc->fbatch);
@@ -2374,8 +2374,6 @@ static struct folio *writeback_finish(struct address_space *mapping,
wbc->done_index = 0;
if (wbc->range_cyclic || (wbc->range_whole && wbc->nr_to_write > 0))
mapping->writeback_index = wbc->done_index;
-
- return NULL;
}
static struct folio *writeback_get_next(struct address_space *mapping,
@@ -2435,20 +2433,19 @@ static struct folio *writeback_get_folio(struct address_space *mapping,
{
struct folio *folio;
- for (;;) {
- folio = writeback_get_next(mapping, wbc);
- if (!folio)
- return writeback_finish(mapping, wbc, false);
+ while ((folio = writeback_get_next(mapping, wbc))) {
wbc->done_index = folio->index;
folio_lock(folio);
- if (likely(should_writeback_folio(mapping, wbc, folio)))
- break;
+ if (likely(should_writeback_folio(mapping, wbc, folio))) {
+ trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
+ return folio;
+ }
folio_unlock(folio);
}
- trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
- return folio;
+ writeback_finish(mapping, wbc, false);
+ return NULL;
}
struct folio *writeback_iter_init(struct address_space *mapping,
@@ -2494,7 +2491,7 @@ struct folio *writeback_iter_next(struct address_space *mapping,
wbc->err = error;
wbc->done_index = folio->index +
folio_nr_pages(folio);
- return writeback_finish(mapping, wbc, true);
+ goto done;
}
if (!wbc->err)
wbc->err = error;
@@ -2507,9 +2504,12 @@ struct folio *writeback_iter_next(struct address_space *mapping,
* to entering this loop.
*/
if (--wbc->nr_to_write <= 0 && wbc->sync_mode == WB_SYNC_NONE)
- return writeback_finish(mapping, wbc, true);
+ goto done;
return writeback_get_folio(mapping, wbc);
+done:
+ writeback_finish(mapping, wbc, true);
+ return NULL;
}
/**
next prev parent reply other threads:[~2023-06-27 16:29 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-26 17:35 [PATCH 00/12] Convert write_cache_pages() to an iterator Matthew Wilcox (Oracle)
2023-06-26 17:35 ` [PATCH 01/12] writeback: Factor out writeback_finish() Matthew Wilcox (Oracle)
2023-06-27 4:05 ` Christoph Hellwig
2023-06-26 17:35 ` [PATCH 02/12] writeback: Factor writeback_get_batch() out of write_cache_pages() Matthew Wilcox (Oracle)
2023-06-26 17:35 ` [PATCH 03/12] writeback: Factor should_writeback_folio() " Matthew Wilcox (Oracle)
2023-06-27 4:12 ` Christoph Hellwig
2023-06-27 11:16 ` Matthew Wilcox
2023-06-27 14:48 ` Matthew Wilcox
2023-06-26 17:35 ` [PATCH 04/12] writeback: Simplify the loops in write_cache_pages() Matthew Wilcox (Oracle)
2023-06-27 4:16 ` Christoph Hellwig
2023-06-26 17:35 ` [PATCH 05/12] pagevec: Add ability to iterate a queue Matthew Wilcox (Oracle)
2023-06-26 17:35 ` [PATCH 06/12] writeback: Use the folio_batch queue iterator Matthew Wilcox (Oracle)
2023-06-27 4:25 ` Christoph Hellwig
2023-06-26 17:35 ` [PATCH 07/12] writeback: Factor writeback_iter_init() out of write_cache_pages() Matthew Wilcox (Oracle)
2023-06-27 4:30 ` Christoph Hellwig
2023-06-27 4:31 ` Christoph Hellwig
2023-06-27 11:08 ` Matthew Wilcox
2023-06-26 17:35 ` [PATCH 08/12] writeback: Factor writeback_get_folio() " Matthew Wilcox (Oracle)
2023-06-27 4:34 ` Christoph Hellwig
2023-06-27 15:25 ` Matthew Wilcox
2023-06-26 17:35 ` [PATCH 09/12] writeback: Factor writeback_iter_next() " Matthew Wilcox (Oracle)
2023-06-27 4:39 ` Christoph Hellwig
2023-06-27 15:31 ` Matthew Wilcox
2023-06-27 16:28 ` Christoph Hellwig [this message]
2023-06-28 9:10 ` Jan Kara
2023-06-26 17:35 ` [PATCH 10/12] writeback: Add for_each_writeback_folio() Matthew Wilcox (Oracle)
2023-06-26 17:35 ` [PATCH 11/12] iomap: Convert iomap_writepages() to use for_each_writeback_folio() Matthew Wilcox (Oracle)
2023-06-26 17:35 ` [PATCH 12/12] writeback: Remove a use of write_cache_pages() from do_writepages() Matthew Wilcox (Oracle)
2023-06-27 4:03 ` [PATCH 00/12] Convert write_cache_pages() to an iterator Christoph Hellwig
2023-06-27 10:53 ` David Howells
2023-06-28 19:31 ` Matthew Wilcox
2023-06-28 20:03 ` David Howells
2023-07-04 18:08 ` Matthew Wilcox
2023-12-12 7:46 ` Christoph Hellwig
2023-11-21 5:18 ` Christoph Hellwig
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=ZJsOLJLtc+SRUU/L@infradead.org \
--to=hch@infradead.org \
--cc=dhowells@redhat.com \
--cc=jack@suse.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.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 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.