mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
mm/sparse: use the new sparse buffer functions in non-vmemmap
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/20180712203730.8703-3-pasha.tatashin@oracle.com Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com> Tested-by: Michael Ellerman <mpe@ellerman.id.au> [powerpc] Reviewed-by: Oscar Salvador <osalvador@suse.de> Tested-by: Oscar Salvador <osalvador@suse.de> Cc: Pasha Tatashin <Pavel.Tatashin@microsoft.com> Cc: Abdul Haleem <abdhalee@linux.vnet.ibm.com> Cc: Baoquan He <bhe@redhat.com> Cc: Daniel Jordan <daniel.m.jordan@oracle.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: David Rientjes <rientjes@google.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jan Kara <jack@suse.cz> Cc: Jérôme Glisse <jglisse@redhat.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Cc: Michal Hocko <mhocko@kernel.org> Cc: Souptick Joarder <jrdr.linux@gmail.com> Cc: Steven Sistare <steven.sistare@oracle.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Wei Yang <richard.weiyang@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
35fd1eb1e8
commit
e131c06b14
41
mm/sparse.c
41
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;
|
||||
unsigned long size = section_map_size();
|
||||
int nr_consumed_maps = 0;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user