2024-04-03 21:24:25

by Matthew Wilcox

[permalink] [raw]
Subject: [PATCH 0/4] Use folio APIs in procfs

Not sure whether Andrew or Christian will want to take this set of
fixes. 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.

Matthew Wilcox (Oracle) (4):
proc: Convert gather_stats to use a folio
proc: Convert smaps_page_accumulate to use a folio
proc: Pass a folio to smaps_page_accumulate()
proc: Convert smaps_pmd_entry to use a folio

fs/proc/task_mmu.c | 37 ++++++++++++++++++++-----------------
1 file changed, 20 insertions(+), 17 deletions(-)

--
2.43.0



2024-04-03 22:34:09

by Matthew Wilcox

[permalink] [raw]
Subject: [PATCH 4/4] proc: Convert smaps_pmd_entry to use a folio

Replace two calls to compound_head() with one.

Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
---
fs/proc/task_mmu.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 6d4f60bc8824..8ff79bd427ec 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -578,6 +578,7 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
struct vm_area_struct *vma = walk->vma;
bool locked = !!(vma->vm_flags & VM_LOCKED);
struct page *page = NULL;
+ struct folio *folio;
bool migration = false;

if (pmd_present(*pmd)) {
@@ -592,11 +593,12 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
}
if (IS_ERR_OR_NULL(page))
return;
- if (PageAnon(page))
+ folio = page_folio(page);
+ if (folio_test_anon(folio))
mss->anonymous_thp += HPAGE_PMD_SIZE;
- else if (PageSwapBacked(page))
+ else if (folio_test_swapbacked(folio))
mss->shmem_thp += HPAGE_PMD_SIZE;
- else if (is_zone_device_page(page))
+ else if (folio_is_zone_device(folio))
/* pass */;
else
mss->file_thp += HPAGE_PMD_SIZE;
--
2.43.0


2024-04-03 22:34:14

by Matthew Wilcox

[permalink] [raw]
Subject: [PATCH 2/4] proc: Convert smaps_page_accumulate to use a folio

Replaces three calls to compound_head() with one. Shrinks the function
from 2614 bytes to 1112 bytes in an allmodconfig build.

Signed-off-by: Matthew Wilcox (Oracle) <[email protected]>
---
fs/proc/task_mmu.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 5260a2788f74..2a3133dd47b1 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -414,11 +414,12 @@ static void smaps_page_accumulate(struct mem_size_stats *mss,
struct page *page, unsigned long size, unsigned long pss,
bool dirty, bool locked, bool private)
{
+ struct folio *folio = page_folio(page);
mss->pss += pss;

- if (PageAnon(page))
+ if (folio_test_anon(folio))
mss->pss_anon += pss;
- else if (PageSwapBacked(page))
+ else if (folio_test_swapbacked(folio))
mss->pss_shmem += pss;
else
mss->pss_file += pss;
@@ -426,7 +427,7 @@ static void smaps_page_accumulate(struct mem_size_stats *mss,
if (locked)
mss->pss_locked += pss;

- if (dirty || PageDirty(page)) {
+ if (dirty || folio_test_dirty(folio)) {
mss->pss_dirty += pss;
if (private)
mss->private_dirty += size;
--
2.43.0