aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Wilcox (Oracle) <[email protected]>2024-02-15 07:36:47 +0100
committerAndrew Morton <[email protected]>2024-02-23 17:48:37 -0800
commita2cbc13638d909e61495f8f4c5968105fff23d9d (patch)
tree3d5d2f11a1d351271019e387a4179e9d98e7fce9
parente6d0ab87c8efe9305024d197bc866122d39be306 (diff)
writeback: move the folio_prepare_writeback loop out of write_cache_pages()
Move the loop for should-we-write-this-folio to writeback_get_folio. [[email protected]: fold loop into existing helper instead of a separate one per Jan] Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Matthew Wilcox (Oracle) <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: Brian Foster <[email protected]> Reviewed-by: Jan Kara <[email protected]> Acked-by: Dave Chinner <[email protected]> Cc: Christian Brauner <[email protected]> Cc: David Howells <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
-rw-r--r--mm/page-writeback.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 3cbe4a7daa35..fc421402f818 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2411,6 +2411,7 @@ static struct folio *writeback_get_folio(struct address_space *mapping,
{
struct folio *folio;
+retry:
folio = folio_batch_next(&wbc->fbatch);
if (!folio) {
folio_batch_release(&wbc->fbatch);
@@ -2418,8 +2419,17 @@ static struct folio *writeback_get_folio(struct address_space *mapping,
filemap_get_folios_tag(mapping, &wbc->index, wbc_end(wbc),
wbc_to_tag(wbc), &wbc->fbatch);
folio = folio_batch_next(&wbc->fbatch);
+ if (!folio)
+ return NULL;
+ }
+
+ folio_lock(folio);
+ if (unlikely(!folio_prepare_writeback(mapping, wbc, folio))) {
+ folio_unlock(folio);
+ goto retry;
}
+ trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
return folio;
}
@@ -2480,14 +2490,6 @@ int write_cache_pages(struct address_space *mapping,
if (!folio)
break;
- folio_lock(folio);
- if (!folio_prepare_writeback(mapping, wbc, folio)) {
- folio_unlock(folio);
- continue;
- }
-
- trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
-
error = writepage(folio, wbc, data);
wbc->nr_to_write -= folio_nr_pages(folio);