|
@@ -1177,9 +1177,10 @@ 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)
|
|
|
{
|
|
|
- mm_zero_struct_page(page);
|
|
|
+ if (zero)
|
|
|
+ mm_zero_struct_page(page);
|
|
|
set_page_links(page, zone, nid, pfn);
|
|
|
init_page_count(page);
|
|
|
page_mapcount_reset(page);
|
|
@@ -1194,9 +1195,9 @@ static void __meminit __init_single_page(struct page *page, unsigned long pfn,
|
|
|
}
|
|
|
|
|
|
static void __meminit __init_single_pfn(unsigned long pfn, unsigned long zone,
|
|
|
- int nid)
|
|
|
+ int nid, bool zero)
|
|
|
{
|
|
|
- return __init_single_page(pfn_to_page(pfn), pfn, zone, nid);
|
|
|
+ return __init_single_page(pfn_to_page(pfn), pfn, zone, nid, zero);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
|
|
@@ -1217,7 +1218,7 @@ static void __meminit init_reserved_page(unsigned long pfn)
|
|
|
if (pfn >= zone->zone_start_pfn && pfn < zone_end_pfn(zone))
|
|
|
break;
|
|
|
}
|
|
|
- __init_single_pfn(pfn, zid, nid);
|
|
|
+ __init_single_pfn(pfn, zid, nid, true);
|
|
|
}
|
|
|
#else
|
|
|
static inline void init_reserved_page(unsigned long pfn)
|
|
@@ -1534,7 +1535,7 @@ static unsigned long __init deferred_init_pages(int nid, int zid,
|
|
|
} else {
|
|
|
page++;
|
|
|
}
|
|
|
- __init_single_page(page, pfn, zid, nid);
|
|
|
+ __init_single_page(page, pfn, zid, nid, true);
|
|
|
nr_pages++;
|
|
|
}
|
|
|
return (nr_pages);
|
|
@@ -5399,15 +5400,20 @@ not_early:
|
|
|
* can be created for invalid pages (for alignment)
|
|
|
* check here not to call set_pageblock_migratetype() against
|
|
|
* pfn out of zone.
|
|
|
+ *
|
|
|
+ * Please note that MEMMAP_HOTPLUG path doesn't clear memmap
|
|
|
+ * because this is done early in sparse_add_one_section
|
|
|
*/
|
|
|
if (!(pfn & (pageblock_nr_pages - 1))) {
|
|
|
struct page *page = pfn_to_page(pfn);
|
|
|
|
|
|
- __init_single_page(page, pfn, zone, nid);
|
|
|
+ __init_single_page(page, pfn, zone, nid,
|
|
|
+ context != MEMMAP_HOTPLUG);
|
|
|
set_pageblock_migratetype(page, MIGRATE_MOVABLE);
|
|
|
cond_resched();
|
|
|
} else {
|
|
|
- __init_single_pfn(pfn, zone, nid);
|
|
|
+ __init_single_pfn(pfn, zone, nid,
|
|
|
+ context != MEMMAP_HOTPLUG);
|
|
|
}
|
|
|
}
|
|
|
}
|