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


Reply via email to