Re: [PATCH v4] mm: introduce a new page type for page pool in page type

From: David Hildenbrand (Arm)

Date: Wed May 13 2026 - 05:34:41 EST


On 5/13/26 11:00, Dragos Tatulea wrote:
>
>
> On 24.02.26 06:13, Byungchul Park wrote:
>> Currently, the condition 'page->pp_magic == PP_SIGNATURE' is used to
>> determine if a page belongs to a page pool. However, with the planned
>> removal of @pp_magic, we should instead leverage the page_type in struct
>> page, such as PGTY_netpp, for this purpose.
>>
>> Introduce and use the page type APIs e.g. PageNetpp(), __SetPageNetpp(),
>> and __ClearPageNetpp() instead, and remove the existing APIs accessing
>> @pp_magic e.g. page_pool_page_is_pp(), netmem_or_pp_magic(), and
>> netmem_clear_pp_magic().
>>
>> Plus, add @page_type to struct net_iov at the same offset as struct page
>> so as to use the page_type APIs for struct net_iov as well. While at it,
>> reorder @type and @owner in struct net_iov to avoid a hole and
>> increasing the struct size.
>>
>> This work was inspired by the following link:
>>
>> https://lore.kernel.org/all/582f41c0-2742-4400-9c81-0d46bf4e8314@xxxxxxxxx/
>>
>> While at it, move the sanity check for page pool to on the free path.
>>
>> Suggested-by: David Hildenbrand <david@xxxxxxxxxx>
>> Co-developed-by: Pavel Begunkov <asml.silence@xxxxxxxxx>
>> Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx>
>> Signed-off-by: Byungchul Park <byungchul@xxxxxx>
>> Acked-by: David Hildenbrand <david@xxxxxxxxxx>
>> Acked-by: Zi Yan <ziy@xxxxxxxxxx>
>> Acked-by: Vlastimil Babka <vbabka@xxxxxxx>
>> Reviewed-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx>
>> ---
>
> Seems like this patch broke tcp_mmap because
> validate_page_before_insert() returns -EINVAL due
> to a page having a type. Here's the full flow:
>
> getsockopt(TCP_ZEROCOPY_RECEIVE) returns -EINVAL because of the
> below flow in the kernel:
>
> tcp_zerocopy_receive()
> -> tcp_zerocopy_vm_insert_batch()
> -> vm_insert_pages()
> -> insert_pages()
> -> insert_page_in_batch_locked()
> -> validate_page_before_insert() returns -EINVAL
> because page_has_type(page) is now true.
>
> The patch below fixes the issue. But is this a valid fix?
>
> diff --git a/mm/memory.c b/mm/memory.c
> index ea6568571131..4cb12673f450 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -2326,7 +2326,7 @@ static int validate_page_before_insert(struct vm_area_struct *vma,
> return -EINVAL;
> return 0;
> }
> - if (folio_test_anon(folio) || page_has_type(page))
> + if (folio_test_anon(folio) || (page_has_type(page) && !PageNetpp(page)))
> return -EINVAL;

That's wrong. The type is stored in page->_mapcount, and rmap code would corrupt
that type.

So if the pages should be mapped to user space, it wouldn't be possible like
this. Today ...

--
Cheers,

David