A future change will remove device private pages from the physical
address space. This will mean that device private pages no longer have
normal PFN 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 <[email protected]>
Signed-off-by: Alistair Popple <[email protected]>
---
 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 fc64f23e05e5..c3e88a199c19 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -192,10 +192,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 7c79b3369b82..6b8c299a6687 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -4317,9 +4317,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 8989d5767528..2472b7381b11 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -1215,6 +1215,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

Reply via email to