Re: [PATCH RFC 2/9] mm: page_reporting: skip redundant zeroing of host-zeroed reported pages

David Hildenbrand (Arm)
2026-04-14T09:18:13Z

On 4/13/26 22:35, Michael S. Tsirkin wrote:
> On Mon, Apr 13, 2026 at 10:00:58AM +0200, David Hildenbrand (Arm) wrote:
>> On 4/13/26 00:50, Michael S. Tsirkin wrote:
>>> When a guest reports free pages to the hypervisor via the page reporting
>>> framework (used by virtio-balloon and hv_balloon), the host typically
>>> zeros those pages when reclaiming their backing memory. However, when
>>> those pages are later allocated in the guest, post_alloc_hook()
>>> unconditionally zeros them again if __GFP_ZERO is set. This
>>> double-zeroing is wasteful, especially for large pages.
>>>
>>> Avoid redundant zeroing by propagating the "host already zeroed this"
>>> information through the allocation path:
>>>
>>> 1. Add a host_zeroes_pages flag to page_reporting_dev_info, allowing
>>> drivers to declare that their host zeros reported pages on reclaim.
>>> A static key (page_reporting_host_zeroes) gates the fast path.
>>>
>>> 2. In page_del_and_expand(), when the page was reported and the
>>> static key is enabled, stash a sentinel value (MAGIC_PAGE_ZEROED)
>>> in page->private.
>>>
>>> 3. In post_alloc_hook(), check page->private for the sentinel. If
>>> present and zeroing was requested (but not tag zeroing), skip
>>> kernel_init_pages().
>>>
>>> In particular, __GFP_ZERO is used by the x86 arch override of
>>> vma_alloc_zeroed_movable_folio.
>>>
>>> No driver sets host_zeroes_pages yet; a follow-up patch to
>>> virtio_balloon is needed to opt in.
>>>
>>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>>> Assisted-by: Claude:claude-opus-4-6
>>> ---
>>> include/linux/mm.h | 6 ++++++
>>> include/linux/page_reporting.h | 3 +++
>>> mm/page_alloc.c | 21 +++++++++++++++++++++
>>> mm/page_reporting.c | 9 +++++++++
>>> mm/page_reporting.h | 2 ++
>>> 5 files changed, 41 insertions(+)
>>>
>>> diff --git a/include/linux/mm.h b/include/linux/mm.h
>>> index 5be3d8a8f806..59fc77c4c90e 100644
>>> --- a/include/linux/mm.h
>>> +++ b/include/linux/mm.h
>>> @@ -4814,6 +4814,12 @@ static inline bool user_alloc_needs_zeroing(void)
>>> &init_on_alloc);
>>> }
>>>
>>> +/*
>>> + * Sentinel stored in page->private to indicate the page was pre-zeroed
>>> + * by the hypervisor (via free page reporting).
>>> + */
>>> +#define MAGIC_PAGE_ZEROED 0x5A45524FU /* ZERO */
>>
>> Why are we not using another page flag that is yet unused for buddy pages?
>>
>> Using page->private for that, and exposing it to buddy users with the
>> __GFP_PREZEROED flag (I hope we can avoid that) does not sound
>> particularly elegant.
>
>
> So here's an only alternative I see: a page flag for when page is in
> buddy and a new "prezero" bool that we have to propagate everywhere
> else. This is a patch on top. More elegant? Please tell me if you prefer that.
> If yes I will squash it into the appropriate patches.

I'd be interesting to know how this would look without the GFP flag,
when we don't have to leak any of this out of the buddy.

--
Cheers,

David