mm/sparse.c: add a static variable nr_present_sections
Patch series "mm/sparse: Optimize memmap allocation during sparse_init()", v6. In sparse_init(), two temporary pointer arrays, usemap_map and map_map are allocated with the size of NR_MEM_SECTIONS. They are used to store each memory section's usemap and mem map if marked as present. In 5-level paging mode, this will cost 512M memory though they will be released at the end of sparse_init(). System with few memory, like kdump kernel which usually only has about 256M, will fail to boot because of allocation failure if CONFIG_X86_5LEVEL=y. In this patchset, optimize the memmap allocation code to only use usemap_map and map_map with the size of nr_present_sections. This makes kdump kernel boot up with normal crashkernel='' setting when CONFIG_X86_5LEVEL=y. This patch (of 5): nr_present_sections is used to record how many memory sections are marked as present during system boot up, and will be used in the later patch. Link: http://lkml.kernel.org/r/20180228032657.32385-2-bhe@redhat.com Signed-off-by: Baoquan He <bhe@redhat.com> Acked-by: Dave Hansen <dave.hansen@intel.com> Reviewed-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Pavel Tatashin <pasha.tatashin@oracle.com> Reviewed-by: Oscar Salvador <osalvador@suse.de> Cc: Pasha Tatashin <Pavel.Tatashin@microsoft.com> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Pankaj Gupta <pagupta@redhat.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
7e010df53c
commit
f2fc10e0b3
|
@ -200,6 +200,12 @@ static inline int next_present_section_nr(int section_nr)
|
|||
(section_nr <= __highest_present_section_nr)); \
|
||||
section_nr = next_present_section_nr(section_nr))
|
||||
|
||||
/*
|
||||
* Record how many memory sections are marked as present
|
||||
* during system bootup.
|
||||
*/
|
||||
static int __initdata nr_present_sections;
|
||||
|
||||
/* Record a memory area against a node. */
|
||||
void __init memory_present(int nid, unsigned long start, unsigned long end)
|
||||
{
|
||||
|
@ -229,6 +235,7 @@ void __init memory_present(int nid, unsigned long start, unsigned long end)
|
|||
ms->section_mem_map = sparse_encode_early_nid(nid) |
|
||||
SECTION_IS_ONLINE;
|
||||
section_mark_present(ms);
|
||||
nr_present_sections++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue