try_to_claim_block() calls expand() with false for both reported and zeroed, losing the zeroed state for claimed pageblocks.
Capture reported and zeroed state before del_page_from_free_list() clears PageReported, and pass them to expand() for sub-page propagation. Signed-off-by: Michael S. Tsirkin <[email protected]> Assisted-by: Claude:claude-opus-4-6 Assisted-by: cursor-agent:GPT-5.4-xhigh --- mm/page_alloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6adc894748c8..b0971a1eaa73 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2345,11 +2345,13 @@ try_to_claim_block(struct zone *zone, struct page *page, /* Take ownership for orders >= pageblock_order */ if (current_order >= pageblock_order) { unsigned int nr_added; + bool was_reported = page_reported(page); + bool was_zeroed = PageZeroed(page); del_page_from_free_list(page, zone, current_order, block_type); change_pageblock_range(page, current_order, start_type); nr_added = expand(zone, page, order, current_order, start_type, - false, false); + was_reported, was_zeroed); account_freepages(zone, nr_added, start_type); return page; } -- MST

