The operations of page count in deferred_init_pages and deferred_free_range is the opposite operation. It's unnecessary and time-consuming. Don't set page count in deferred_init_pages, as it'll be reset later. The following data was tested on an x86 machine with 190GB of RAM. before: node 0 deferred pages initialised in 78ms after: node 0 deferred pages initialised in 72ms Signed-off-by: Yajun Deng <yajun.deng@xxxxxxxxx> --- mm/mm_init.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mm/mm_init.c b/mm/mm_init.c index 1cc310f706a9..fe78f6916c66 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c @@ -1984,7 +1984,7 @@ static void __init deferred_free_range(unsigned long pfn, if (nr_pages == MAX_ORDER_NR_PAGES && IS_MAX_ORDER_ALIGNED(pfn)) { for (i = 0; i < nr_pages; i += pageblock_nr_pages) set_pageblock_migratetype(page + i, MIGRATE_MOVABLE); - __free_pages_core(page, MAX_ORDER, MEMINIT_LATE); + __free_pages_core(page, MAX_ORDER, MEMINIT_EARLY); return; } @@ -1994,7 +1994,7 @@ static void __init deferred_free_range(unsigned long pfn, for (i = 0; i < nr_pages; i++, page++, pfn++) { if (pageblock_aligned(pfn)) set_pageblock_migratetype(page, MIGRATE_MOVABLE); - __free_pages_core(page, 0, MEMINIT_LATE); + __free_pages_core(page, 0, MEMINIT_EARLY); } } @@ -2068,7 +2068,7 @@ static unsigned long __init deferred_init_pages(struct zone *zone, } else { page++; } - __init_single_page(page, pfn, zid, nid, true, false); + __init_single_page(page, pfn, zid, nid, false, false); nr_pages++; } return (nr_pages); -- 2.25.1