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
