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

Reply via email to