]> Pileus Git - ~andy/linux/blobdiff - mm/sparse-vmemmap.c
Merge branch 'timers-nohz-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / mm / sparse-vmemmap.c
index 1b7e22ab9b091bf34d857b5aeb36fd08039c0378..27eeab3be757e8c9bf04a18dba9dfd7f7aaa5ab1 100644 (file)
@@ -53,10 +53,12 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node)
                struct page *page;
 
                if (node_state(node, N_HIGH_MEMORY))
-                       page = alloc_pages_node(node,
-                               GFP_KERNEL | __GFP_ZERO, get_order(size));
+                       page = alloc_pages_node(
+                               node, GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT,
+                               get_order(size));
                else
-                       page = alloc_pages(GFP_KERNEL | __GFP_ZERO,
+                       page = alloc_pages(
+                               GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT,
                                get_order(size));
                if (page)
                        return page_address(page);
@@ -145,11 +147,10 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)
        return pgd;
 }
 
-int __meminit vmemmap_populate_basepages(struct page *start_page,
-                                               unsigned long size, int node)
+int __meminit vmemmap_populate_basepages(unsigned long start,
+                                        unsigned long end, int node)
 {
-       unsigned long addr = (unsigned long)start_page;
-       unsigned long end = (unsigned long)(start_page + size);
+       unsigned long addr = start;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
@@ -176,9 +177,15 @@ int __meminit vmemmap_populate_basepages(struct page *start_page,
 
 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);
-       if (error)
+       unsigned long start;
+       unsigned long end;
+       struct page *map;
+
+       map = pfn_to_page(pnum * PAGES_PER_SECTION);
+       start = (unsigned long)map;
+       end = (unsigned long)(map + PAGES_PER_SECTION);
+
+       if (vmemmap_populate(start, end, nid))
                return NULL;
 
        return map;