|
@@ -838,33 +838,12 @@ static int free_tail_pages_check(struct page *head_page, struct page *page)
|
|
|
static void __meminit __init_single_page(struct page *page, unsigned long pfn,
|
|
|
unsigned long zone, int nid)
|
|
|
{
|
|
|
- struct zone *z = &NODE_DATA(nid)->node_zones[zone];
|
|
|
-
|
|
|
set_page_links(page, zone, nid, pfn);
|
|
|
mminit_verify_page_links(page, zone, nid, pfn);
|
|
|
init_page_count(page);
|
|
|
page_mapcount_reset(page);
|
|
|
page_cpupid_reset_last(page);
|
|
|
|
|
|
- /*
|
|
|
- * Mark the block movable so that blocks are reserved for
|
|
|
- * movable at startup. This will force kernel allocations
|
|
|
- * to reserve their blocks rather than leaking throughout
|
|
|
- * the address space during boot when many long-lived
|
|
|
- * kernel allocations are made. Later some blocks near
|
|
|
- * the start are marked MIGRATE_RESERVE by
|
|
|
- * setup_zone_migrate_reserve()
|
|
|
- *
|
|
|
- * bitmap is created for zone's valid pfn range. but memmap
|
|
|
- * can be created for invalid pages (for alignment)
|
|
|
- * check here not to call set_pageblock_migratetype() against
|
|
|
- * pfn out of zone.
|
|
|
- */
|
|
|
- if ((z->zone_start_pfn <= pfn)
|
|
|
- && (pfn < zone_end_pfn(z))
|
|
|
- && !(pfn & (pageblock_nr_pages - 1)))
|
|
|
- set_pageblock_migratetype(page, MIGRATE_MOVABLE);
|
|
|
-
|
|
|
INIT_LIST_HEAD(&page->lru);
|
|
|
#ifdef WANT_PAGE_VIRTUAL
|
|
|
/* The shift won't overflow because ZONE_NORMAL is below 4G. */
|
|
@@ -1073,6 +1052,7 @@ static void __defermem_init deferred_free_range(struct page *page,
|
|
|
/* Free a large naturally-aligned chunk if possible */
|
|
|
if (nr_pages == MAX_ORDER_NR_PAGES &&
|
|
|
(pfn & (MAX_ORDER_NR_PAGES-1)) == 0) {
|
|
|
+ set_pageblock_migratetype(page, MIGRATE_MOVABLE);
|
|
|
__free_pages_boot_core(page, pfn, MAX_ORDER-1);
|
|
|
return;
|
|
|
}
|
|
@@ -4593,7 +4573,29 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
|
|
|
&nr_initialised))
|
|
|
break;
|
|
|
}
|
|
|
- __init_single_pfn(pfn, zone, nid);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Mark the block movable so that blocks are reserved for
|
|
|
+ * movable at startup. This will force kernel allocations
|
|
|
+ * to reserve their blocks rather than leaking throughout
|
|
|
+ * the address space during boot when many long-lived
|
|
|
+ * kernel allocations are made. Later some blocks near
|
|
|
+ * the start are marked MIGRATE_RESERVE by
|
|
|
+ * setup_zone_migrate_reserve()
|
|
|
+ *
|
|
|
+ * bitmap is created for zone's valid pfn range. but memmap
|
|
|
+ * can be created for invalid pages (for alignment)
|
|
|
+ * check here not to call set_pageblock_migratetype() against
|
|
|
+ * pfn out of zone.
|
|
|
+ */
|
|
|
+ if (!(pfn & (pageblock_nr_pages - 1))) {
|
|
|
+ struct page *page = pfn_to_page(pfn);
|
|
|
+
|
|
|
+ __init_single_page(page, pfn, zone, nid);
|
|
|
+ set_pageblock_migratetype(page, MIGRATE_MOVABLE);
|
|
|
+ } else {
|
|
|
+ __init_single_pfn(pfn, zone, nid);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|