On s390, zero page's size relies on total ram pages. Since we plan to move the accounting into __free_pages_core(), totalram_pages may not represent the total usable pages on system at this point when defer_init is enabled. We can get the total usable pages from memblock directly. The size maybe not accurate due to the alignment, but enough for the calculation. Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxx> CC: Mike Rapoport (IBM) <rppt@xxxxxxxxxx> CC: David Hildenbrand <david@xxxxxxxxxx> --- Not tested on a machine, hope it is fine. --- arch/s390/mm/init.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index e769d2726f4e..d811ffa5e147 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -65,12 +65,13 @@ static void __init setup_zero_pages(void) unsigned int order; struct page *page; int i; + unsigned long total_pages = PHYS_PFN(memblock_phys_mem_size() - memblock_reserved_size()); /* Latest machines require a mapping granularity of 512KB */ order = 7; /* Limit number of empty zero pages for small memory sizes */ - while (order > 2 && (totalram_pages() >> 10) < (1UL << order)) + while (order > 2 && (total_pages >> 10) < (1UL << order)) order--; empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order); -- 2.34.1