Commit 902c2d91 authored by Ma Wupeng's avatar Ma Wupeng Committed by Ard Biesheuvel

memblock: Disable mirror feature if kernelcore is not specified

If system have some mirrored memory and mirrored feature is not specified
in boot parameter, the basic mirrored feature will be enabled and this will
lead to the following situations:

- memblock memory allocation prefers mirrored region. This may have some
  unexpected influence on numa affinity.

- contiguous memory will be split into several parts if parts of them
  is mirrored memory via memblock_mark_mirror().

To fix this, variable mirrored_kernelcore will be checked in
memblock_mark_mirror(). Mark mirrored memory with flag MEMBLOCK_MIRROR iff
kernelcore=mirror is added in the kernel parameters.
Signed-off-by: default avatarMa Wupeng <mawupeng1@huawei.com>
Acked-by: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20220614092156.1972846-6-mawupeng1@huawei.comAcked-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
parent c0b978fe
...@@ -861,4 +861,6 @@ struct folio *try_grab_folio(struct page *page, int refs, unsigned int flags); ...@@ -861,4 +861,6 @@ struct folio *try_grab_folio(struct page *page, int refs, unsigned int flags);
DECLARE_PER_CPU(struct per_cpu_nodestat, boot_nodestats); DECLARE_PER_CPU(struct per_cpu_nodestat, boot_nodestats);
extern bool mirrored_kernelcore;
#endif /* __MM_INTERNAL_H */ #endif /* __MM_INTERNAL_H */
...@@ -924,6 +924,9 @@ int __init_memblock memblock_clear_hotplug(phys_addr_t base, phys_addr_t size) ...@@ -924,6 +924,9 @@ int __init_memblock memblock_clear_hotplug(phys_addr_t base, phys_addr_t size)
*/ */
int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size) int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
{ {
if (!mirrored_kernelcore)
return 0;
system_has_some_mirror = true; system_has_some_mirror = true;
return memblock_setclr_flag(base, size, 1, MEMBLOCK_MIRROR); return memblock_setclr_flag(base, size, 1, MEMBLOCK_MIRROR);
......
...@@ -356,7 +356,7 @@ static unsigned long required_kernelcore_percent __initdata; ...@@ -356,7 +356,7 @@ static unsigned long required_kernelcore_percent __initdata;
static unsigned long required_movablecore __initdata; static unsigned long required_movablecore __initdata;
static unsigned long required_movablecore_percent __initdata; static unsigned long required_movablecore_percent __initdata;
static unsigned long zone_movable_pfn[MAX_NUMNODES] __initdata; static unsigned long zone_movable_pfn[MAX_NUMNODES] __initdata;
static bool mirrored_kernelcore __meminitdata; bool mirrored_kernelcore __initdata_memblock;
/* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */ /* movable_zone is the "real" zone pages in ZONE_MOVABLE are taken from */
int movable_zone; int movable_zone;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment