[RFC, PATCH 09/12] mm/pagemap: add PAGE_IS_UFFD_DEACTIVATED to PAGEMAP_SCAN

From: Kiryl Shutsemau (Meta)

Date: Tue Apr 14 2026 - 10:26:52 EST


Report deactivated anonymous pages in PAGEMAP_SCAN results.
Only set on anonymous VMAs (shmem cold = !PAGE_IS_PRESENT).
Both PTE and PMD (THP) levels handled.

Signed-off-by: Kiryl Shutsemau (Meta) <kas@xxxxxxxxxx>
Assisted-by: Claude:claude-opus-4-6
---
fs/proc/task_mmu.c | 11 ++++++++++-
include/uapi/linux/fs.h | 1 +
2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index e091931d7ca1..fc42cfd5720a 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -2329,7 +2329,7 @@ static int pagemap_release(struct inode *inode, struct file *file)
PAGE_IS_FILE | PAGE_IS_PRESENT | \
PAGE_IS_SWAPPED | PAGE_IS_PFNZERO | \
PAGE_IS_HUGE | PAGE_IS_SOFT_DIRTY | \
- PAGE_IS_GUARD)
+ PAGE_IS_GUARD | PAGE_IS_UFFD_DEACTIVATED)
#define PM_SCAN_FLAGS (PM_SCAN_WP_MATCHING | PM_SCAN_CHECK_WPASYNC)

struct pagemap_scan_private {
@@ -2354,6 +2354,10 @@ static unsigned long pagemap_page_category(struct pagemap_scan_private *p,

categories = PAGE_IS_PRESENT;

+ if (pte_protnone(pte) && vma_is_accessible(vma) &&
+ vma_is_anonymous(vma) && userfaultfd_minor(vma))
+ categories |= PAGE_IS_UFFD_DEACTIVATED;
+
if (!pte_uffd_wp(pte))
categories |= PAGE_IS_WRITTEN;

@@ -2422,6 +2426,11 @@ static unsigned long pagemap_thp_category(struct pagemap_scan_private *p,
struct page *page;

categories |= PAGE_IS_PRESENT;
+
+ if (pmd_protnone(pmd) && vma_is_accessible(vma) &&
+ vma_is_anonymous(vma) && userfaultfd_minor(vma))
+ categories |= PAGE_IS_UFFD_DEACTIVATED;
+
if (!pmd_uffd_wp(pmd))
categories |= PAGE_IS_WRITTEN;

diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index 70b2b661f42c..af5b28901800 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -455,6 +455,7 @@ typedef int __bitwise __kernel_rwf_t;
#define PAGE_IS_HUGE (1 << 6)
#define PAGE_IS_SOFT_DIRTY (1 << 7)
#define PAGE_IS_GUARD (1 << 8)
+#define PAGE_IS_UFFD_DEACTIVATED (1 << 9)

/*
* struct page_region - Page region with flags
--
2.51.2