From c3a852d019bc0c45887ed727fbd8704bc8f3da31 Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Wed, 8 Apr 2020 09:46:47 +0800 Subject: [PATCH] mm/page_alloc.c: Zero all page struct in advance in memmap_init_zone when CONFIG_ROCKCHIP_THUNDER_BOOT=y In memmap_init_zone, it check all pages valid or deferred by single page, then zero and init the corresponding page struct. It is safe to zero all page struct in advance at once no matter what the state of every page is. This can save time when booting kernel. Change-Id: Ieb5864231fbc751e9438be488a77ce442b91ce7b Signed-off-by: Simon Xue --- mm/page_alloc.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a276c3a8541d..dce28228d359 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1513,9 +1513,15 @@ static void free_one_page(struct zone *zone, } static void __meminit __init_single_page(struct page *page, unsigned long pfn, - unsigned long zone, int nid) + unsigned long zone, int nid, + bool zero_page_struct __maybe_unused) { +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT + if (zero_page_struct) + mm_zero_struct_page(page); +#else mm_zero_struct_page(page); +#endif set_page_links(page, zone, nid, pfn); init_page_count(page); page_mapcount_reset(page); @@ -1548,7 +1554,7 @@ static void __meminit init_reserved_page(unsigned long pfn) if (pfn >= zone->zone_start_pfn && pfn < zone_end_pfn(zone)) break; } - __init_single_page(pfn_to_page(pfn), pfn, zid, nid); + __init_single_page(pfn_to_page(pfn), pfn, zid, nid, true); } #else static inline void init_reserved_page(unsigned long pfn) @@ -1862,7 +1868,7 @@ static unsigned long __init deferred_init_pages(struct zone *zone, } else { page++; } - __init_single_page(page, pfn, zid, nid); + __init_single_page(page, pfn, zid, nid, true); nr_pages++; } return (nr_pages); @@ -6212,6 +6218,11 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, } #endif +#ifdef CONFIG_ROCKCHIP_THUNDER_BOOT + /* Zero all page struct in advance */ + memset(pfn_to_page(start_pfn), 0, sizeof(struct page) * size); +#endif + for (pfn = start_pfn; pfn < end_pfn; ) { /* * There can be holes in boot-time mem_map[]s handed to this @@ -6225,7 +6236,7 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, } page = pfn_to_page(pfn); - __init_single_page(page, pfn, zone, nid); + __init_single_page(page, pfn, zone, nid, false); if (context == MEMINIT_HOTPLUG) __SetPageReserved(page); @@ -6271,7 +6282,7 @@ void __ref memmap_init_zone_device(struct zone *zone, for (pfn = start_pfn; pfn < end_pfn; pfn++) { struct page *page = pfn_to_page(pfn); - __init_single_page(page, pfn, zone_idx, nid); + __init_single_page(page, pfn, zone_idx, nid, true); /* * Mark page reserved as it will need to wait for onlining @@ -6356,7 +6367,7 @@ static u64 __meminit init_unavailable_range(unsigned long spfn, + pageblock_nr_pages - 1; continue; } - __init_single_page(pfn_to_page(pfn), pfn, zone, node); + __init_single_page(pfn_to_page(pfn), pfn, zone, node, true); __SetPageReserved(pfn_to_page(pfn)); pgcnt++; }