The scratch memory for kexec handover is used to bootstrap the kexec'ed kernel. It is only needed when CONFIG_MEMBLOCK_KHO_SCRATCH is enabled (selected by KHO) and if it is a KHO boot. Add checks to prevent marking a KHO scratch region unless needed. kexec_handover.h is now unconditionally included for is_kho_boot. Fixes: a2daf83e10378 ("x86/e820: temporarily enable KHO scratch for memory below 1M") Reported-by: Vlad Poenaru Signed-off-by: Usama Arif --- mm/memblock.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/mm/memblock.c b/mm/memblock.c index e23e16618e9b3..5c85d575bb61c 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -20,8 +20,8 @@ #ifdef CONFIG_KEXEC_HANDOVER #include -#include #endif /* CONFIG_KEXEC_HANDOVER */ +#include #include #include @@ -1126,8 +1126,11 @@ int __init_memblock memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t */ __init int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size) { - return memblock_setclr_flag(&memblock.memory, base, size, 1, - MEMBLOCK_KHO_SCRATCH); + if (IS_ENABLED(CONFIG_MEMBLOCK_KHO_SCRATCH) && is_kho_boot()) + return memblock_setclr_flag(&memblock.memory, base, size, 1, + MEMBLOCK_KHO_SCRATCH); + else + return 0; } /** @@ -1140,8 +1143,11 @@ __init int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size) */ __init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size) { - return memblock_setclr_flag(&memblock.memory, base, size, 0, - MEMBLOCK_KHO_SCRATCH); + if (IS_ENABLED(CONFIG_MEMBLOCK_KHO_SCRATCH) && is_kho_boot()) + return memblock_setclr_flag(&memblock.memory, base, size, 0, + MEMBLOCK_KHO_SCRATCH); + else + return 0; } static bool should_skip_region(struct memblock_type *type, -- 2.47.3