void __meminit __init_single_page(struct page *page, unsigned long pfn,
                                unsigned long zone, int nid);
+void __meminit __init_reserved_page_zone(unsigned long pfn, int nid);
 
 /* shrinker related functions */
 unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg,
 
 static inline void fixup_hashdist(void) {}
 #endif /* CONFIG_NUMA */
 
+/*
+ * Initialize a reserved page unconditionally, finding its zone first.
+ */
+void __meminit __init_reserved_page_zone(unsigned long pfn, int nid)
+{
+       pg_data_t *pgdat;
+       int zid;
+
+       pgdat = NODE_DATA(nid);
+
+       for (zid = 0; zid < MAX_NR_ZONES; zid++) {
+               struct zone *zone = &pgdat->node_zones[zid];
+
+               if (zone_spans_pfn(zone, pfn))
+                       break;
+       }
+       __init_single_page(pfn_to_page(pfn), pfn, zid, nid);
+
+       if (pageblock_aligned(pfn))
+               set_pageblock_migratetype(pfn_to_page(pfn), MIGRATE_MOVABLE);
+}
+
 #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
 static inline void pgdat_set_deferred_range(pg_data_t *pgdat)
 {
 
 static void __meminit init_reserved_page(unsigned long pfn, int nid)
 {
-       pg_data_t *pgdat;
-       int zid;
-
        if (early_page_initialised(pfn, nid))
                return;
 
-       pgdat = NODE_DATA(nid);
-
-       for (zid = 0; zid < MAX_NR_ZONES; zid++) {
-               struct zone *zone = &pgdat->node_zones[zid];
-
-               if (zone_spans_pfn(zone, pfn))
-                       break;
-       }
-       __init_single_page(pfn_to_page(pfn), pfn, zid, nid);
-
-       if (pageblock_aligned(pfn))
-               set_pageblock_migratetype(pfn_to_page(pfn), MIGRATE_MOVABLE);
+       __init_reserved_page_zone(pfn, nid);
 }
 #else
 static inline void pgdat_set_deferred_range(pg_data_t *pgdat) {}