diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index a6972750e7c5..c7dd9c86e353 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1177,9 +1177,10 @@ static void free_one_page(struct zone *zone, | |||
1177 | } | 1177 | } |
1178 | 1178 | ||
1179 | static void __meminit __init_single_page(struct page *page, unsigned long pfn, | 1179 | static void __meminit __init_single_page(struct page *page, unsigned long pfn, |
1180 | unsigned long zone, int nid) | 1180 | unsigned long zone, int nid, bool zero) |
1181 | { | 1181 | { |
1182 | mm_zero_struct_page(page); | 1182 | if (zero) |
1183 | mm_zero_struct_page(page); | ||
1183 | set_page_links(page, zone, nid, pfn); | 1184 | set_page_links(page, zone, nid, pfn); |
1184 | init_page_count(page); | 1185 | init_page_count(page); |
1185 | page_mapcount_reset(page); | 1186 | page_mapcount_reset(page); |
@@ -1194,9 +1195,9 @@ static void __meminit __init_single_page(struct page *page, unsigned long pfn, | |||
1194 | } | 1195 | } |
1195 | 1196 | ||
1196 | static void __meminit __init_single_pfn(unsigned long pfn, unsigned long zone, | 1197 | static void __meminit __init_single_pfn(unsigned long pfn, unsigned long zone, |
1197 | int nid) | 1198 | int nid, bool zero) |
1198 | { | 1199 | { |
1199 | return __init_single_page(pfn_to_page(pfn), pfn, zone, nid); | 1200 | return __init_single_page(pfn_to_page(pfn), pfn, zone, nid, zero); |
1200 | } | 1201 | } |
1201 | 1202 | ||
1202 | #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT | 1203 | #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT |
@@ -1217,7 +1218,7 @@ static void __meminit init_reserved_page(unsigned long pfn) | |||
1217 | if (pfn >= zone->zone_start_pfn && pfn < zone_end_pfn(zone)) | 1218 | if (pfn >= zone->zone_start_pfn && pfn < zone_end_pfn(zone)) |
1218 | break; | 1219 | break; |
1219 | } | 1220 | } |
1220 | __init_single_pfn(pfn, zid, nid); | 1221 | __init_single_pfn(pfn, zid, nid, true); |
1221 | } | 1222 | } |
1222 | #else | 1223 | #else |
1223 | static inline void init_reserved_page(unsigned long pfn) | 1224 | static inline void init_reserved_page(unsigned long pfn) |
@@ -1534,7 +1535,7 @@ static unsigned long __init deferred_init_pages(int nid, int zid, | |||
1534 | } else { | 1535 | } else { |
1535 | page++; | 1536 | page++; |
1536 | } | 1537 | } |
1537 | __init_single_page(page, pfn, zid, nid); | 1538 | __init_single_page(page, pfn, zid, nid, true); |
1538 | nr_pages++; | 1539 | nr_pages++; |
1539 | } | 1540 | } |
1540 | return (nr_pages); | 1541 | return (nr_pages); |
@@ -5399,15 +5400,20 @@ not_early: | |||
5399 | * can be created for invalid pages (for alignment) | 5400 | * can be created for invalid pages (for alignment) |
5400 | * check here not to call set_pageblock_migratetype() against | 5401 | * check here not to call set_pageblock_migratetype() against |
5401 | * pfn out of zone. | 5402 | * pfn out of zone. |
5403 | * | ||
5404 | * Please note that MEMMAP_HOTPLUG path doesn't clear memmap | ||
5405 | * because this is done early in sparse_add_one_section | ||
5402 | */ | 5406 | */ |
5403 | if (!(pfn & (pageblock_nr_pages - 1))) { | 5407 | if (!(pfn & (pageblock_nr_pages - 1))) { |
5404 | struct page *page = pfn_to_page(pfn); | 5408 | struct page *page = pfn_to_page(pfn); |
5405 | 5409 | ||
5406 | __init_single_page(page, pfn, zone, nid); | 5410 | __init_single_page(page, pfn, zone, nid, |
5411 | context != MEMMAP_HOTPLUG); | ||
5407 | set_pageblock_migratetype(page, MIGRATE_MOVABLE); | 5412 | set_pageblock_migratetype(page, MIGRATE_MOVABLE); |
5408 | cond_resched(); | 5413 | cond_resched(); |
5409 | } else { | 5414 | } else { |
5410 | __init_single_pfn(pfn, zone, nid); | 5415 | __init_single_pfn(pfn, zone, nid, |
5416 | context != MEMMAP_HOTPLUG); | ||
5411 | } | 5417 | } |
5412 | } | 5418 | } |
5413 | } | 5419 | } |