diff options
-rw-r--r-- | include/linux/mm.h | 2 | ||||
-rw-r--r-- | mm/sparse-vmemmap.c | 2 | ||||
-rw-r--r-- | mm/sparse.c | 25 |
3 files changed, 24 insertions, 5 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 292c6862375..cc551f06728 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1147,7 +1147,7 @@ extern int randomize_va_space; const char * arch_vma_name(struct vm_area_struct *vma); -struct page *sparse_early_mem_map_populate(unsigned long pnum, int nid); +struct page *sparse_mem_map_populate(unsigned long pnum, int nid); pgd_t *vmemmap_pgd_populate(unsigned long addr, int node); pud_t *vmemmap_pud_populate(pgd_t *pgd, unsigned long addr, int node); pmd_t *vmemmap_pmd_populate(pud_t *pud, unsigned long addr, int node); diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 4f2d4854f84..d3b718b0c20 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -137,7 +137,7 @@ int __meminit vmemmap_populate_basepages(struct page *start_page, return 0; } -struct page __init *sparse_early_mem_map_populate(unsigned long pnum, int nid) +struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid) { struct page *map = pfn_to_page(pnum * PAGES_PER_SECTION); int error = vmemmap_populate(map, PAGES_PER_SECTION, nid); diff --git a/mm/sparse.c b/mm/sparse.c index 1f4dbb867b8..08fb14f5eea 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -259,7 +259,7 @@ static unsigned long *sparse_early_usemap_alloc(unsigned long pnum) } #ifndef CONFIG_SPARSEMEM_VMEMMAP -struct page __init *sparse_early_mem_map_populate(unsigned long pnum, int nid) +struct page __init *sparse_mem_map_populate(unsigned long pnum, int nid) { struct page *map; @@ -284,7 +284,7 @@ struct page __init *sparse_early_mem_map_alloc(unsigned long pnum) struct mem_section *ms = __nr_to_section(pnum); int nid = sparse_early_nid(ms); - map = sparse_early_mem_map_populate(pnum, nid); + map = sparse_mem_map_populate(pnum, nid); if (map) return map; @@ -322,6 +322,18 @@ void __init sparse_init(void) } #ifdef CONFIG_MEMORY_HOTPLUG +#ifdef CONFIG_SPARSEMEM_VMEMMAP +static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid, + unsigned long nr_pages) +{ + /* This will make the necessary allocations eventually. */ + return sparse_mem_map_populate(pnum, nid); +} +static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) +{ + return; /* XXX: Not implemented yet */ +} +#else static struct page *__kmalloc_section_memmap(unsigned long nr_pages) { struct page *page, *ret; @@ -344,6 +356,12 @@ got_map_ptr: return ret; } +static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid, + unsigned long nr_pages) +{ + return __kmalloc_section_memmap(nr_pages); +} + static int vaddr_in_vmalloc_area(void *addr) { if (addr >= (void *)VMALLOC_START && @@ -360,6 +378,7 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) free_pages((unsigned long)memmap, get_order(sizeof(struct page) * nr_pages)); } +#endif /* CONFIG_SPARSEMEM_VMEMMAP */ /* * returns the number of sections whose mem_maps were properly @@ -382,7 +401,7 @@ int sparse_add_one_section(struct zone *zone, unsigned long start_pfn, * plus, it does a kmalloc */ sparse_index_init(section_nr, pgdat->node_id); - memmap = __kmalloc_section_memmap(nr_pages); + memmap = kmalloc_section_memmap(section_nr, pgdat->node_id, nr_pages); usemap = __kmalloc_section_usemap(); pgdat_resize_lock(pgdat, &flags); |