Re: [PATCH RFC 3/9] mm: add __GFP_PREZEROED flag and folio_test_clear_prezeroed()
From: David Hildenbrand (Arm)
Date: Mon Apr 13 2026 - 05:06:58 EST
On 4/13/26 00:50, Michael S. Tsirkin wrote:
> The previous patch skips zeroing in post_alloc_hook() when
> __GFP_ZERO is used. However, several page allocation paths
> zero pages via folio_zero_user() or clear_user_highpage() after
> allocation, not via __GFP_ZERO.
>
> Add __GFP_PREZEROED gfp flag that tells post_alloc_hook() to
> preserve the MAGIC_PAGE_ZEROED sentinel in page->private so the
> caller can detect pre-zeroed pages and skip its own zeroing.
> Add folio_test_clear_prezeroed() helper to check and clear
> the sentinel.
I really don't like __GFP_PREZEROED, and wonder how we can avoid it.
What you want is, allocate a folio (well, actually a page that becomes
a folio) and know whether zeroing for that folio (once we establish it
from a page) is still required.
Or you just allocate a folio, specify GFP_ZERO, and let the folio
allocation code deal with that.
I think we have two options:
(1) Use an indication that can be sticky for callers that do not care.
Assuming we would use a page flag that is only ever used on folios, all
we'd have to do is make sure that we clear the flag once we convert
the to a folio.
For example, PG_dropbehind is only ever set on folios in the pagecache.
Paths that allocate folios would have to clear the flag. For non-hugetlb
folios that happens through page_rmappable_folio().
I'm not super-happy about that, but it would be doable.
(2) Use a dedicated allocation interface for user pages in the buddy.
I hate the whole user_alloc_needs_zeroing()+folio_zero_user() handling.
It shouldn't exist. We should just be passing GFP_ZERO and let the buddy handle
all that.
For example, vma_alloc_folio() already gets passed the address in.
Pass the address from vma_alloc_folio_noprof()->folio_alloc_noprof(), and let
folio_alloc_noprof() use a buddy interface that can handle it.
Imagine if we had a alloc_user_pages_noprof() that consumes an address. It could just
do what folio_zero_user() does, and only if really required.
The whole user_alloc_needs_zeroing() could go away and you could just handle the
pre-zeroed optimization internally.
--
Cheers,
David