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 <[email protected]>
Signed-off-by: Alistair Popple <[email protected]>
---
v1:
  - 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

Reply via email to