proc: convert gather_stats to use a folio
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 3 Apr 2024 17:14:52 +0000 (18:14 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 26 Apr 2024 03:56:35 +0000 (20:56 -0700)
Patch series "Use folio APIs in procfs".

We're down to very few users of the PageFoo macros, with proc being a
major user.

After this patchset and another patchset I have for khugepaged, we can get
rid of PageActive, PageReadahead and PageSwapBacked.  This patchset has
the usual advantages in its own right of removing hidden calls to
compound_head().  We have the page table lock, so the mapcount & refcount
are stable and there can't be any races with folios suddenly becoming tail
pages.

This patch (of 4):

Replaces six calls to compound_head() with one.  Shrinks the function from
5054 bytes to 1756 bytes in an allmodconfig build.

Link: https://lkml.kernel.org/r/20240403171456.1445117-1-willy@infradead.org
Link: https://lkml.kernel.org/r/20240403171456.1445117-2-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Christian Brauner <brauner@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/proc/task_mmu.c

index e8d1008a838d7a00bc52b3dc52fc17d679586138..5260a2788f748c609888b4dd0cd7f0e9d6ef6bbb 100644 (file)
@@ -2549,28 +2549,29 @@ struct numa_maps_private {
 static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty,
                        unsigned long nr_pages)
 {
+       struct folio *folio = page_folio(page);
        int count = page_mapcount(page);
 
        md->pages += nr_pages;
-       if (pte_dirty || PageDirty(page))
+       if (pte_dirty || folio_test_dirty(folio))
                md->dirty += nr_pages;
 
-       if (PageSwapCache(page))
+       if (folio_test_swapcache(folio))
                md->swapcache += nr_pages;
 
-       if (PageActive(page) || PageUnevictable(page))
+       if (folio_test_active(folio) || folio_test_unevictable(folio))
                md->active += nr_pages;
 
-       if (PageWriteback(page))
+       if (folio_test_writeback(folio))
                md->writeback += nr_pages;
 
-       if (PageAnon(page))
+       if (folio_test_anon(folio))
                md->anon += nr_pages;
 
        if (count > md->mapcount_max)
                md->mapcount_max = count;
 
-       md->node[page_to_nid(page)] += nr_pages;
+       md->node[folio_nid(folio)] += nr_pages;
 }
 
 static struct page *can_gather_numa_stats(pte_t pte, struct vm_area_struct *vma,