[PATCH v2 09/11] mm/util: Add flag to track device private pages in page snapshots

Jordan Niethe
2026-01-07T14:19:17Z

A future change will remove device private pages from the physical
address space. This will mean that device private pages no longer have
normal pfns and must be handled separately.

Add a new flag PAGE_SNAPSHOT_DEVICE_PRIVATE to track when the pfn of a
page snapshot is a device private page.

Signed-off-by: Jordan Niethe <jniethe@nvidia.com>
Signed-off-by: Alistair Popple <apopple@nvidia.com>
---
v1:
- No change
v2:
- No change
---
fs/proc/page.c | 6 ++++--
include/linux/mm.h | 7 ++++---
mm/util.c | 3 +++
3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/fs/proc/page.c b/fs/proc/page.c
index f9b2c2c906cd..adca0e681442 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -191,10 +191,12 @@ u64 stable_page_flags(const struct page *page)
folio_test_large_rmappable(folio)) {
/* Note: we indicate any THPs here, not just PMD-sized ones */
u |= 1 << KPF_THP;
- } else if (is_huge_zero_pfn(ps.pfn)) {
+ } else if (!(ps.flags & PAGE_SNAPSHOT_DEVICE_PRIVATE) &&
+ is_huge_zero_pfn(ps.pfn)) {
u |= 1 << KPF_ZERO_PAGE;
u |= 1 << KPF_THP;
- } else if (is_zero_pfn(ps.pfn)) {
+ } else if (!(ps.flags & PAGE_SNAPSHOT_DEVICE_PRIVATE)
+ && is_zero_pfn(ps.pfn)) {
u |= 1 << KPF_ZERO_PAGE;
}

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 15076261d0c2..e65329e1969f 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -4623,9 +4623,10 @@ static inline bool page_pool_page_is_pp(const struct page *page)
}
#endif

-#define PAGE_SNAPSHOT_FAITHFUL (1 << 0)
-#define PAGE_SNAPSHOT_PG_BUDDY (1 << 1)
-#define PAGE_SNAPSHOT_PG_IDLE (1 << 2)
+#define PAGE_SNAPSHOT_FAITHFUL (1 << 0)
+#define PAGE_SNAPSHOT_PG_BUDDY (1 << 1)
+#define PAGE_SNAPSHOT_PG_IDLE (1 << 2)
+#define PAGE_SNAPSHOT_DEVICE_PRIVATE (1 << 3)

struct page_snapshot {
struct folio folio_snapshot;
diff --git a/mm/util.c b/mm/util.c
index 97cae40c0209..65e3f1a97d76 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -1218,6 +1218,9 @@ static void set_ps_flags(struct page_snapshot *ps, const struct folio *folio,

if (folio_test_idle(folio))
ps->flags |= PAGE_SNAPSHOT_PG_IDLE;
+
+ if (is_device_private_page(page))
+ ps->flags |= PAGE_SNAPSHOT_DEVICE_PRIVATE;
}

/**
--
2.34.1