The scratch memory for kexec handover is used to bootstrap the kexec'ed kernel. Only the 1st 1MB is used as scratch, and its a hack to get around limitations with KHO. It is only needed when CONFIG_KEXEC_HANDOVER is enabled and only if it is a KHO boot (both checked by is_kho_boot). Add check to prevent marking a KHO scratch region unless needed. Fixes: a2daf83e10378 ("x86/e820: temporarily enable KHO scratch for memory below 1M") Reported-by: Vlad Poenaru Signed-off-by: Usama Arif Reviewed-by: Pratyush Yadav --- mm/memblock.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/mm/memblock.c b/mm/memblock.c index 8b13d5c28922a..913cf322eb89a 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,10 @@ 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_kho_boot()) + return memblock_setclr_flag(&memblock.memory, base, size, 1, + MEMBLOCK_KHO_SCRATCH); + return 0; } /** @@ -1140,8 +1142,10 @@ __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_kho_boot()) + return memblock_setclr_flag(&memblock.memory, base, size, 0, + MEMBLOCK_KHO_SCRATCH); + return 0; } static bool should_skip_region(struct memblock_type *type, -- 2.47.3