]> Git Repo - linux.git/commitdiff
mm/sparse: use the new sparse buffer functions in non-vmemmap
authorPavel Tatashin <[email protected]>
Fri, 17 Aug 2018 22:49:26 +0000 (15:49 -0700)
committerLinus Torvalds <[email protected]>
Fri, 17 Aug 2018 23:20:32 +0000 (16:20 -0700)
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

Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Pavel Tatashin <[email protected]>
Tested-by: Michael Ellerman <[email protected]> [powerpc]
Reviewed-by: Oscar Salvador <[email protected]>
Tested-by: Oscar Salvador <[email protected]>
Cc: Pasha Tatashin <[email protected]>
Cc: Abdul Haleem <[email protected]>
Cc: Baoquan He <[email protected]>
Cc: Daniel Jordan <[email protected]>
Cc: Dan Williams <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: David Rientjes <[email protected]>
Cc: Greg Kroah-Hartman <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Jan Kara <[email protected]>
Cc: Jérôme Glisse <[email protected]>
Cc: "Kirill A. Shutemov" <[email protected]>
Cc: Michal Hocko <[email protected]>
Cc: Souptick Joarder <[email protected]>
Cc: Steven Sistare <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Cc: Wei Yang <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
mm/sparse.c

index 9a0a5f59846987a50fbde517ef136dd85e5830cd..db4867b62fff67c36372944ca7a29f94f5634ca9 100644 (file)
@@ -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 */
 
This page took 0.05934 seconds and 4 git commands to generate.