On 3/6/26 17:02, David Hildenbrand (Arm) wrote: > On 2/2/26 12:36, Jordan Niethe wrote: >> 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 >> v2: >> - No change >> v3: >> - No change >> v4: >> - Move logical continuation to previous line >> --- >> 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..bc14f7ebc369 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 f0d5be9dc736..a52979536a5e 100644 >> --- a/include/linux/mm.h >> +++ b/include/linux/mm.h >> @@ -4627,9 +4627,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; > > stable_page_flags() has access to the page and can simply test that instead? >
Or maybe even better, if the pfn has no meaning, set it to 0 or -1, or anything that will make the other code just ignore it. -- Cheers, David
