]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mm: merge writeout into pageout
authorChristoph Hellwig <hch@lst.de>
Mon, 1 Jun 2026 11:34:28 +0000 (13:34 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 21 Jun 2026 18:37:35 +0000 (11:37 -0700)
writeout is only called from pageout, and a straight flow at the end, so
merge the two functions.

Link: https://lore.kernel.org/20260601113449.3464734-3-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Baoquan He <baoquan.he@linux.dev>
Reviewed-by: Nhat Pham <nphamcs@gmail.com>
Acked-by: David Hildenbrand (Arm) <david@kernel.org>
Cc: Chris Li <chrisl@kernel.org>
Cc: Kairui Song <kasong@tencent.com>
Cc: Kemeng Shi <shikemeng@huaweicloud.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/vmscan.c

index 3f3ff25e561ac34d2ea9d1c1ee2e2a19b1e9c974..299b5d9e8836573883f7887857c67d397ca521ae 100644 (file)
@@ -612,45 +612,14 @@ typedef enum {
        PAGE_CLEAN,
 } pageout_t;
 
-static pageout_t writeout(struct folio *folio, struct address_space *mapping,
-               struct swap_iocb **plug, struct list_head *folio_list)
-{
-       int res;
-
-       folio_set_reclaim(folio);
-
-       /*
-        * The large shmem folio can be split if CONFIG_THP_SWAP is not enabled
-        * or we failed to allocate contiguous swap entries, in which case
-        * the split out folios get added back to folio_list.
-        */
-       if (shmem_mapping(mapping))
-               res = shmem_writeout(folio, plug, folio_list);
-       else
-               res = swap_writeout(folio, plug);
-
-       if (res < 0)
-               handle_write_error(mapping, folio, res);
-       if (res == AOP_WRITEPAGE_ACTIVATE) {
-               folio_clear_reclaim(folio);
-               return PAGE_ACTIVATE;
-       }
-
-       /* synchronous write? */
-       if (!folio_test_writeback(folio))
-               folio_clear_reclaim(folio);
-
-       trace_mm_vmscan_write_folio(folio);
-       node_stat_add_folio(folio, NR_VMSCAN_WRITE);
-       return PAGE_SUCCESS;
-}
-
 /*
  * pageout is called by shrink_folio_list() for each dirty folio.
  */
 static pageout_t pageout(struct folio *folio, struct address_space *mapping,
                         struct swap_iocb **plug, struct list_head *folio_list)
 {
+       int res;
+
        /*
         * We no longer attempt to writeback filesystem folios here, other
         * than tmpfs/shmem.  That's taken care of in page-writeback.
@@ -674,7 +643,33 @@ static pageout_t pageout(struct folio *folio, struct address_space *mapping,
                return PAGE_ACTIVATE;
        if (!folio_clear_dirty_for_io(folio))
                return PAGE_CLEAN;
-       return writeout(folio, mapping, plug, folio_list);
+
+       folio_set_reclaim(folio);
+
+       /*
+        * The large shmem folio can be split if CONFIG_THP_SWAP is not enabled
+        * or we failed to allocate contiguous swap entries, in which case
+        * the split out folios get added back to folio_list.
+        */
+       if (shmem_mapping(mapping))
+               res = shmem_writeout(folio, plug, folio_list);
+       else
+               res = swap_writeout(folio, plug);
+
+       if (res < 0)
+               handle_write_error(mapping, folio, res);
+       if (res == AOP_WRITEPAGE_ACTIVATE) {
+               folio_clear_reclaim(folio);
+               return PAGE_ACTIVATE;
+       }
+
+       /* synchronous write? */
+       if (!folio_test_writeback(folio))
+               folio_clear_reclaim(folio);
+
+       trace_mm_vmscan_write_folio(folio);
+       node_stat_add_folio(folio, NR_VMSCAN_WRITE);
+       return PAGE_SUCCESS;
 }
 
 /*