From: Ma Wupeng mawupeng1@huawei.com
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I4SK3S CVE: NA
--------------------------------
With this patch, kernel will check mirrored_kernelcore before calling efi_find_mirror() which will enable basic mirrored feature.
If system have some mirrored memory and mirrored feature is not spcified in boot parameter, the basic mirrored feature will be enabled and this will lead to the following situations:
- memblock memory allocation perfers mirrored region. This may have some unexpected influence on numa affinity.
- contiguous memory will be splited into server parts if parts of them is mirrored memroy via memblock_mark_mirror().
Signed-off-by: Ma Wupeng mawupeng1@huawei.com Reviewed-by: Xie XiuQi xiexiuqi@huawei.com Reviewed-by: Kefeng Wangwangkefeng.wang@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- drivers/firmware/efi/efi.c | 3 +++ include/linux/mm.h | 2 ++ mm/page_alloc.c | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c index a159ae07d66f8..184ad34b9c582 100644 --- a/drivers/firmware/efi/efi.c +++ b/drivers/firmware/efi/efi.c @@ -409,6 +409,9 @@ void __init efi_find_mirror(void) efi_memory_desc_t *md; u64 mirror_size = 0, total_size = 0;
+ if (!mirrored_kernelcore) + return; + for_each_efi_memory_desc(md) { unsigned long long start = md->phys_addr; unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; diff --git a/include/linux/mm.h b/include/linux/mm.h index b318e9c6cc43d..460b8d4cae877 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2270,6 +2270,8 @@ extern void free_bootmem_with_active_regions(int nid, unsigned long max_low_pfn); extern void sparse_memory_present_with_active_regions(int nid);
+extern bool mirrored_kernelcore; + #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */
#if !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) && \ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 200e19fe216ae..14b4debd998e9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -319,7 +319,7 @@ static unsigned long required_kernelcore_percent __initdata; static unsigned long required_movablecore __initdata; static unsigned long required_movablecore_percent __initdata; static unsigned long zone_movable_pfn[MAX_NUMNODES] __meminitdata; -static bool mirrored_kernelcore __meminitdata; +bool mirrored_kernelcore __meminitdata;
/* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */ int movable_zone;