diff options
author | Baoquan He <bhe@redhat.com> | 2018-08-17 18:48:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-17 19:20:31 -0400 |
commit | f2fc10e0b3fe7d1aecbd2cab6bf0007b6771e16d (patch) | |
tree | 54ba9725c59a875521f0982e7bf3579547f8a007 | |
parent | 7e010df53c80197b23119e7d7b95892aa13629df (diff) |
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>
-rw-r--r-- | mm/sparse.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/mm/sparse.c b/mm/sparse.c index b1b14a9c4041..99a6383e98bc 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -200,6 +200,12 @@ static inline int next_present_section_nr(int section_nr) | |||
200 | (section_nr <= __highest_present_section_nr)); \ | 200 | (section_nr <= __highest_present_section_nr)); \ |
201 | section_nr = next_present_section_nr(section_nr)) | 201 | section_nr = next_present_section_nr(section_nr)) |
202 | 202 | ||
203 | /* | ||
204 | * Record how many memory sections are marked as present | ||
205 | * during system bootup. | ||
206 | */ | ||
207 | static int __initdata nr_present_sections; | ||
208 | |||
203 | /* Record a memory area against a node. */ | 209 | /* Record a memory area against a node. */ |
204 | void __init memory_present(int nid, unsigned long start, unsigned long end) | 210 | void __init memory_present(int nid, unsigned long start, unsigned long end) |
205 | { | 211 | { |
@@ -229,6 +235,7 @@ void __init memory_present(int nid, unsigned long start, unsigned long end) | |||
229 | ms->section_mem_map = sparse_encode_early_nid(nid) | | 235 | ms->section_mem_map = sparse_encode_early_nid(nid) | |
230 | SECTION_IS_ONLINE; | 236 | SECTION_IS_ONLINE; |
231 | section_mark_present(ms); | 237 | section_mark_present(ms); |
238 | nr_present_sections++; | ||
232 | } | 239 | } |
233 | } | 240 | } |
234 | } | 241 | } |