|
@@ -6140,7 +6140,7 @@ static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
|
|
#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
|
|
#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
|
|
|
|
|
|
/* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */
|
|
/* Initialise the number of pages represented by NR_PAGEBLOCK_BITS */
|
|
-void __meminit set_pageblock_order(void)
|
|
|
|
|
|
+void __init set_pageblock_order(void)
|
|
{
|
|
{
|
|
unsigned int order;
|
|
unsigned int order;
|
|
|
|
|
|
@@ -6168,13 +6168,13 @@ void __meminit set_pageblock_order(void)
|
|
* include/linux/pageblock-flags.h for the values of pageblock_order based on
|
|
* include/linux/pageblock-flags.h for the values of pageblock_order based on
|
|
* the kernel config
|
|
* the kernel config
|
|
*/
|
|
*/
|
|
-void __meminit set_pageblock_order(void)
|
|
|
|
|
|
+void __init set_pageblock_order(void)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
|
|
#endif /* CONFIG_HUGETLB_PAGE_SIZE_VARIABLE */
|
|
|
|
|
|
-static unsigned long __meminit calc_memmap_size(unsigned long spanned_pages,
|
|
|
|
|
|
+static unsigned long __init calc_memmap_size(unsigned long spanned_pages,
|
|
unsigned long present_pages)
|
|
unsigned long present_pages)
|
|
{
|
|
{
|
|
unsigned long pages = spanned_pages;
|
|
unsigned long pages = spanned_pages;
|
|
@@ -6225,19 +6225,8 @@ static void pgdat_init_kcompactd(struct pglist_data *pgdat)
|
|
static void pgdat_init_kcompactd(struct pglist_data *pgdat) {}
|
|
static void pgdat_init_kcompactd(struct pglist_data *pgdat) {}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-/*
|
|
|
|
- * Set up the zone data structures:
|
|
|
|
- * - mark all pages reserved
|
|
|
|
- * - mark all memory queues empty
|
|
|
|
- * - clear the memory bitmaps
|
|
|
|
- *
|
|
|
|
- * NOTE: pgdat should get zeroed by caller.
|
|
|
|
- */
|
|
|
|
-static void __meminit free_area_init_core(struct pglist_data *pgdat)
|
|
|
|
|
|
+static void __meminit pgdat_init_internals(struct pglist_data *pgdat)
|
|
{
|
|
{
|
|
- enum zone_type j;
|
|
|
|
- int nid = pgdat->node_id;
|
|
|
|
-
|
|
|
|
pgdat_resize_init(pgdat);
|
|
pgdat_resize_init(pgdat);
|
|
|
|
|
|
pgdat_init_numabalancing(pgdat);
|
|
pgdat_init_numabalancing(pgdat);
|
|
@@ -6250,7 +6239,54 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat)
|
|
pgdat_page_ext_init(pgdat);
|
|
pgdat_page_ext_init(pgdat);
|
|
spin_lock_init(&pgdat->lru_lock);
|
|
spin_lock_init(&pgdat->lru_lock);
|
|
lruvec_init(node_lruvec(pgdat));
|
|
lruvec_init(node_lruvec(pgdat));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __meminit zone_init_internals(struct zone *zone, enum zone_type idx, int nid,
|
|
|
|
+ unsigned long remaining_pages)
|
|
|
|
+{
|
|
|
|
+ zone->managed_pages = remaining_pages;
|
|
|
|
+ zone_set_nid(zone, nid);
|
|
|
|
+ zone->name = zone_names[idx];
|
|
|
|
+ zone->zone_pgdat = NODE_DATA(nid);
|
|
|
|
+ spin_lock_init(&zone->lock);
|
|
|
|
+ zone_seqlock_init(zone);
|
|
|
|
+ zone_pcp_init(zone);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Set up the zone data structures
|
|
|
|
+ * - init pgdat internals
|
|
|
|
+ * - init all zones belonging to this node
|
|
|
|
+ *
|
|
|
|
+ * NOTE: this function is only called during memory hotplug
|
|
|
|
+ */
|
|
|
|
+#ifdef CONFIG_MEMORY_HOTPLUG
|
|
|
|
+void __ref free_area_init_core_hotplug(int nid)
|
|
|
|
+{
|
|
|
|
+ enum zone_type z;
|
|
|
|
+ pg_data_t *pgdat = NODE_DATA(nid);
|
|
|
|
+
|
|
|
|
+ pgdat_init_internals(pgdat);
|
|
|
|
+ for (z = 0; z < MAX_NR_ZONES; z++)
|
|
|
|
+ zone_init_internals(&pgdat->node_zones[z], z, nid, 0);
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Set up the zone data structures:
|
|
|
|
+ * - mark all pages reserved
|
|
|
|
+ * - mark all memory queues empty
|
|
|
|
+ * - clear the memory bitmaps
|
|
|
|
+ *
|
|
|
|
+ * NOTE: pgdat should get zeroed by caller.
|
|
|
|
+ * NOTE: this function is only called during early init.
|
|
|
|
+ */
|
|
|
|
+static void __init free_area_init_core(struct pglist_data *pgdat)
|
|
|
|
+{
|
|
|
|
+ enum zone_type j;
|
|
|
|
+ int nid = pgdat->node_id;
|
|
|
|
|
|
|
|
+ pgdat_init_internals(pgdat);
|
|
pgdat->per_cpu_nodestats = &boot_nodestats;
|
|
pgdat->per_cpu_nodestats = &boot_nodestats;
|
|
|
|
|
|
for (j = 0; j < MAX_NR_ZONES; j++) {
|
|
for (j = 0; j < MAX_NR_ZONES; j++) {
|
|
@@ -6298,13 +6334,7 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat)
|
|
* when the bootmem allocator frees pages into the buddy system.
|
|
* when the bootmem allocator frees pages into the buddy system.
|
|
* And all highmem pages will be managed by the buddy system.
|
|
* And all highmem pages will be managed by the buddy system.
|
|
*/
|
|
*/
|
|
- zone->managed_pages = freesize;
|
|
|
|
- zone_set_nid(zone, nid);
|
|
|
|
- zone->name = zone_names[j];
|
|
|
|
- zone->zone_pgdat = pgdat;
|
|
|
|
- spin_lock_init(&zone->lock);
|
|
|
|
- zone_seqlock_init(zone);
|
|
|
|
- zone_pcp_init(zone);
|
|
|
|
|
|
+ zone_init_internals(zone, j, nid, freesize);
|
|
|
|
|
|
if (!size)
|
|
if (!size)
|
|
continue;
|
|
continue;
|
|
@@ -6379,7 +6409,7 @@ static inline void pgdat_set_deferred_range(pg_data_t *pgdat)
|
|
static inline void pgdat_set_deferred_range(pg_data_t *pgdat) {}
|
|
static inline void pgdat_set_deferred_range(pg_data_t *pgdat) {}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-void __meminit free_area_init_node(int nid, unsigned long *zones_size,
|
|
|
|
|
|
+void __init free_area_init_node(int nid, unsigned long *zones_size,
|
|
unsigned long node_start_pfn,
|
|
unsigned long node_start_pfn,
|
|
unsigned long *zholes_size)
|
|
unsigned long *zholes_size)
|
|
{
|
|
{
|
|
@@ -6418,7 +6448,7 @@ void __meminit free_area_init_node(int nid, unsigned long *zones_size,
|
|
* may be accessed (for example page_to_pfn() on some configuration accesses
|
|
* may be accessed (for example page_to_pfn() on some configuration accesses
|
|
* flags). We must explicitly zero those struct pages.
|
|
* flags). We must explicitly zero those struct pages.
|
|
*/
|
|
*/
|
|
-void __meminit zero_resv_unavail(void)
|
|
|
|
|
|
+void __init zero_resv_unavail(void)
|
|
{
|
|
{
|
|
phys_addr_t start, end;
|
|
phys_addr_t start, end;
|
|
unsigned long pfn;
|
|
unsigned long pfn;
|