mm/page_idle: Convert page_idle_clear_pte_refs() to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 29 Jan 2022 20:53:59 +0000 (15:53 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 21 Mar 2022 16:59:02 +0000 (12:59 -0400)
The PG_idle and PG_young bits are ignored if they're set on tail
pages, so ensure we're passing a folio around.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
mm/page_idle.c

index 3e05bf1..2427d83 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/page_ext.h>
 #include <linux/page_idle.h>
 
+#include "internal.h"
+
 #define BITMAP_CHUNK_SIZE      sizeof(u64)
 #define BITMAP_CHUNK_BITS      (BITMAP_CHUNK_SIZE * BITS_PER_BYTE)
 
@@ -48,7 +50,8 @@ static bool page_idle_clear_pte_refs_one(struct page *page,
                                        struct vm_area_struct *vma,
                                        unsigned long addr, void *arg)
 {
-       DEFINE_PAGE_VMA_WALK(pvmw, page, vma, addr, 0);
+       struct folio *folio = page_folio(page);
+       DEFINE_FOLIO_VMA_WALK(pvmw, folio, vma, addr, 0);
        bool referenced = false;
 
        while (page_vma_mapped_walk(&pvmw)) {
@@ -70,19 +73,20 @@ static bool page_idle_clear_pte_refs_one(struct page *page,
        }
 
        if (referenced) {
-               clear_page_idle(page);
+               folio_clear_idle(folio);
                /*
                 * We cleared the referenced bit in a mapping to this page. To
                 * avoid interference with page reclaim, mark it young so that
                 * page_referenced() will return > 0.
                 */
-               set_page_young(page);
+               folio_set_young(folio);
        }
        return true;
 }
 
 static void page_idle_clear_pte_refs(struct page *page)
 {
+       struct folio *folio = page_folio(page);
        /*
         * Since rwc.arg is unused, rwc is effectively immutable, so we
         * can make it static const to save some cycles and stack.
@@ -93,18 +97,17 @@ static void page_idle_clear_pte_refs(struct page *page)
        };
        bool need_lock;
 
-       if (!page_mapped(page) ||
-           !page_rmapping(page))
+       if (!folio_mapped(folio) || !folio_raw_mapping(folio))
                return;
 
-       need_lock = !PageAnon(page) || PageKsm(page);
-       if (need_lock && !trylock_page(page))
+       need_lock = !folio_test_anon(folio) || folio_test_ksm(folio);
+       if (need_lock && !folio_trylock(folio))
                return;
 
-       rmap_walk(page, (struct rmap_walk_control *)&rwc);
+       rmap_walk(&folio->page, (struct rmap_walk_control *)&rwc);
 
        if (need_lock)
-               unlock_page(page);
+               folio_unlock(folio);
 }
 
 static ssize_t page_idle_bitmap_read(struct file *file, struct kobject *kobj,