Subject: Re: [PATCH RFC v4 14/22] mm: page_reporting: skip redundant zeroing of host-zeroed reported pages

From: "Michael S. Tsirkin" <[email-masked]>
Date: Mon, 27 Apr 2026 11:18:00 -0400

On Mon, Apr 27, 2026 at 11:13:44AM -0400, Zi Yan wrote:
> On Sun Apr 26, 2026 at 5:48 PM EDT, 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:
> >
> > - 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.
> >
> > - Add PG_zeroed page flag (sharing PG_private bit) to mark pages
> >   that have been zeroed by the host.  Set it on reported pages during
> >   allocation from the buddy in page_del_and_expand().
> >
> > - Thread the zeroed bool through rmqueue -> prep_new_page ->
> >   post_alloc_hook, where it skips redundant zeroing for __GFP_ZERO
> >   allocations.
> >
> > 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 <[email-masked]>
> > Assisted-by: Claude:claude-opus-4-6
> > Assisted-by: cursor-agent:GPT-5.4-xhigh
> > ---
> >  include/linux/page-flags.h     |  9 +++++
> >  include/linux/page_reporting.h |  3 ++
> >  mm/compaction.c                |  6 ++--
> >  mm/internal.h                  |  2 +-
> >  mm/page_alloc.c                | 66 +++++++++++++++++++++++-----------
> >  mm/page_reporting.c            | 14 +++++++-
> >  mm/page_reporting.h            | 12 +++++++
> >  7 files changed, 87 insertions(+), 25 deletions(-)
> >
> > diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h
> > index f7a0e4af0c73..eef2499cba8b 100644
> > --- a/include/linux/page-flags.h
> > +++ b/include/linux/page-flags.h
> > @@ -135,6 +135,8 @@ enum pageflags {
> >  	PG_swapcache = PG_owner_priv_1, /* Swap page: swp_entry_t in private */
> >  	/* Some filesystems */
> >  	PG_checked = PG_owner_priv_1,
> > +	/* Page contents are known to be zero */
> > +	PG_zeroed = PG_private,
> 
> +willy,
> 
> I was discussing with willy and David about removing PG_private and
> repurposing it to PG_folio to identify folios. IIUC, PG_zeroed is only
> set for PageBuddy, so it should not be an issue to set it for allocated
> pages for folio identification. Let me know if I get it wrong.
> 
> Thanks.
> 
> -- 
> Best Regards,
> Yan, Zi

Exactly. Trivial to switch to another bit, of course - most are
unused in the buddy.

-- 
MST