non-vmemmap sparse also allocated large contiguous chunk of memory, and if
fails falls back to smaller allocations. Use the same functions to allocate
buffer as the vmemmap-sparse

Signed-off-by: Pavel Tatashin <pasha.tatas...@oracle.com>
---
 mm/sparse.c | 41 ++++++++++++++---------------------------
 1 file changed, 14 insertions(+), 27 deletions(-)

diff --git a/mm/sparse.c b/mm/sparse.c
index ac57bae476f4..976854a3af8b 100644
--- a/mm/sparse.c
+++ b/mm/sparse.c
@@ -408,13 +408,20 @@ unsigned long __init section_map_size(void)
 }
 
 #else
+unsigned long __init section_map_size(void)
+{
+       return PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION);
+}
+
 struct page __init *sparse_mem_map_populate(unsigned long pnum, int nid,
                struct vmem_altmap *altmap)
 {
-       struct page *map;
-       unsigned long size;
+       unsigned long size = section_map_size();
+       struct page *map = sparse_buffer_alloc(size);
+
+       if (map)
+               return map;
 
-       size = PAGE_ALIGN(sizeof(struct page) * PAGES_PER_SECTION);
        map = memblock_virt_alloc_try_nid(size,
                                          PAGE_SIZE, __pa(MAX_DMA_ADDRESS),
                                          BOOTMEM_ALLOC_ACCESSIBLE, nid);
@@ -425,42 +432,22 @@ void __init sparse_mem_maps_populate_node(struct page 
**map_map,
                                          unsigned long pnum_end,
                                          unsigned long map_count, int nodeid)
 {
-       void *map;
        unsigned long pnum;
-       unsigned long size = sizeof(struct page) * PAGES_PER_SECTION;
-       int nr_consumed_maps;
-
-       size = PAGE_ALIGN(size);
-       map = memblock_virt_alloc_try_nid_raw(size * map_count,
-                                             PAGE_SIZE, __pa(MAX_DMA_ADDRESS),
-                                             BOOTMEM_ALLOC_ACCESSIBLE, nodeid);
-       if (map) {
-               nr_consumed_maps = 0;
-               for (pnum = pnum_begin; pnum < pnum_end; pnum++) {
-                       if (!present_section_nr(pnum))
-                               continue;
-                       map_map[nr_consumed_maps] = map;
-                       map += size;
-                       nr_consumed_maps++;
-               }
-               return;
-       }
+       unsigned long size = section_map_size();
+       int nr_consumed_maps = 0;
 
-       /* fallback */
-       nr_consumed_maps = 0;
+       sparse_buffer_init(size * map_count, nodeid);
        for (pnum = pnum_begin; pnum < pnum_end; pnum++) {
-               struct mem_section *ms;
-
                if (!present_section_nr(pnum))
                        continue;
                map_map[nr_consumed_maps] =
                                sparse_mem_map_populate(pnum, nodeid, NULL);
                if (map_map[nr_consumed_maps++])
                        continue;
-               ms = __nr_to_section(pnum);
                pr_err("%s: sparsemem memory map backing failed some memory 
will not be available\n",
                       __func__);
        }
+       sparse_buffer_fini();
 }
 #endif /* !CONFIG_SPARSEMEM_VMEMMAP */
 
-- 
2.18.0

Reply via email to