|
@@ -91,9 +91,8 @@ static void release_memory_resource(struct resource *res)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_MEMORY_HOTPLUG_SPARSE
|
|
|
-#ifndef CONFIG_SPARSEMEM_VMEMMAP
|
|
|
-static void get_page_bootmem(unsigned long info, struct page *page,
|
|
|
- unsigned long type)
|
|
|
+void get_page_bootmem(unsigned long info, struct page *page,
|
|
|
+ unsigned long type)
|
|
|
{
|
|
|
page->lru.next = (struct list_head *) type;
|
|
|
SetPagePrivate(page);
|
|
@@ -128,6 +127,8 @@ void __ref put_page_bootmem(struct page *page)
|
|
|
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_HAVE_BOOTMEM_INFO_NODE
|
|
|
+#ifndef CONFIG_SPARSEMEM_VMEMMAP
|
|
|
static void register_page_bootmem_info_section(unsigned long start_pfn)
|
|
|
{
|
|
|
unsigned long *usemap, mapsize, section_nr, i;
|
|
@@ -161,6 +162,32 @@ static void register_page_bootmem_info_section(unsigned long start_pfn)
|
|
|
get_page_bootmem(section_nr, page, MIX_SECTION_INFO);
|
|
|
|
|
|
}
|
|
|
+#else /* CONFIG_SPARSEMEM_VMEMMAP */
|
|
|
+static void register_page_bootmem_info_section(unsigned long start_pfn)
|
|
|
+{
|
|
|
+ unsigned long *usemap, mapsize, section_nr, i;
|
|
|
+ struct mem_section *ms;
|
|
|
+ struct page *page, *memmap;
|
|
|
+
|
|
|
+ if (!pfn_valid(start_pfn))
|
|
|
+ return;
|
|
|
+
|
|
|
+ section_nr = pfn_to_section_nr(start_pfn);
|
|
|
+ ms = __nr_to_section(section_nr);
|
|
|
+
|
|
|
+ memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr);
|
|
|
+
|
|
|
+ register_page_bootmem_memmap(section_nr, memmap, PAGES_PER_SECTION);
|
|
|
+
|
|
|
+ usemap = __nr_to_section(section_nr)->pageblock_flags;
|
|
|
+ page = virt_to_page(usemap);
|
|
|
+
|
|
|
+ mapsize = PAGE_ALIGN(usemap_size()) >> PAGE_SHIFT;
|
|
|
+
|
|
|
+ for (i = 0; i < mapsize; i++, page++)
|
|
|
+ get_page_bootmem(section_nr, page, MIX_SECTION_INFO);
|
|
|
+}
|
|
|
+#endif /* !CONFIG_SPARSEMEM_VMEMMAP */
|
|
|
|
|
|
void register_page_bootmem_info_node(struct pglist_data *pgdat)
|
|
|
{
|
|
@@ -203,7 +230,7 @@ void register_page_bootmem_info_node(struct pglist_data *pgdat)
|
|
|
register_page_bootmem_info_section(pfn);
|
|
|
}
|
|
|
}
|
|
|
-#endif /* !CONFIG_SPARSEMEM_VMEMMAP */
|
|
|
+#endif /* CONFIG_HAVE_BOOTMEM_INFO_NODE */
|
|
|
|
|
|
static void grow_zone_span(struct zone *zone, unsigned long start_pfn,
|
|
|
unsigned long end_pfn)
|