vmscan: convert page buffer handling to use folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 13 May 2022 03:23:02 +0000 (20:23 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 13 May 2022 14:20:15 +0000 (07:20 -0700)
This mostly just removes calls to compound_head() although nr_reclaimed
should be incremented by the number of pages, not just 1.

Link: https://lkml.kernel.org/r/20220504182857.4013401-11-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/vmscan.c

index 773b88c..00b985c 100644 (file)
@@ -1859,38 +1859,40 @@ retry:
                }
 
                /*
-                * If the page has buffers, try to free the buffer mappings
-                * associated with this page. If we succeed we try to free
-                * the page as well.
+                * If the folio has buffers, try to free the buffer
+                * mappings associated with this folio. If we succeed
+                * we try to free the folio as well.
                 *
-                * We do this even if the page is PageDirty().
-                * try_to_release_page() does not perform I/O, but it is
-                * possible for a page to have PageDirty set, but it is actually
-                * clean (all its buffers are clean).  This happens if the
-                * buffers were written out directly, with submit_bh(). ext3
-                * will do this, as well as the blockdev mapping.
-                * try_to_release_page() will discover that cleanness and will
-                * drop the buffers and mark the page clean - it can be freed.
+                * We do this even if the folio is dirty.
+                * filemap_release_folio() does not perform I/O, but it
+                * is possible for a folio to have the dirty flag set,
+                * but it is actually clean (all its buffers are clean).
+                * This happens if the buffers were written out directly,
+                * with submit_bh(). ext3 will do this, as well as
+                * the blockdev mapping.  filemap_release_folio() will
+                * discover that cleanness and will drop the buffers
+                * and mark the folio clean - it can be freed.
                 *
-                * Rarely, pages can have buffers and no ->mapping.  These are
-                * the pages which were not successfully invalidated in
-                * truncate_cleanup_page().  We try to drop those buffers here
-                * and if that worked, and the page is no longer mapped into
-                * process address space (page_count == 1) it can be freed.
-                * Otherwise, leave the page on the LRU so it is swappable.
+                * Rarely, folios can have buffers and no ->mapping.
+                * These are the folios which were not successfully
+                * invalidated in truncate_cleanup_folio().  We try to
+                * drop those buffers here and if that worked, and the
+                * folio is no longer mapped into process address space
+                * (refcount == 1) it can be freed.  Otherwise, leave
+                * the folio on the LRU so it is swappable.
                 */
-               if (page_has_private(page)) {
-                       if (!try_to_release_page(page, sc->gfp_mask))
+               if (folio_has_private(folio)) {
+                       if (!filemap_release_folio(folio, sc->gfp_mask))
                                goto activate_locked;
-                       if (!mapping && page_count(page) == 1) {
-                               unlock_page(page);
-                               if (put_page_testzero(page))
+                       if (!mapping && folio_ref_count(folio) == 1) {
+                               folio_unlock(folio);
+                               if (folio_put_testzero(folio))
                                        goto free_it;
                                else {
                                        /*
                                         * rare race with speculative reference.
                                         * the speculative reference will free
-                                        * this page shortly, so we may
+                                        * this folio shortly, so we may
                                         * increment nr_reclaimed here (and
                                         * leave it off the LRU).
                                         */