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?

-- 
Cheers,

David

Reply via email to