From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9FA642C235D for ; Thu, 27 Nov 2025 21:38:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764279483; cv=none; b=gtOT/78QECOvxSSxfdZfA/0yzsiTqmQylNgBCxUoa1hTi/iylce4K37bGUC7kRD/L/tYE0UB7gazQO5+uXe3Pzi1KkgBUB2PfJWZ280zu9pNKCrr73RY1ZBi6lB0c6AS0w2J7qMwo969X9GmQwtjhXu3MnPTCQgLAi9Yepk4otY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764279483; c=relaxed/simple; bh=J/Cd6H6DLpMMXY1wyttaMvCbQYILdLOCg4qVpGR/P3c=; h=From:To:Cc:Subject:In-Reply-To:References:Date:Message-ID: MIME-Version:Content-Type; b=iWSlrc/JO60h1SoWO9w406/4zKXe3sTyeNVS/dYSiMFZxwhT5EpDPl2ul55W5heQgaJVc8ei8DMdH+e3pI7xCOw0odEqkBkXqJqKm0ydjEA9CjaUdncsK+77qLoerrcMV8umYSDXIJIL/wbcbRV4kXWp4qYGPEeP/MkzxDAMnio= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=e30rOSDi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="e30rOSDi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id B8C67C4CEF8; Thu, 27 Nov 2025 21:37:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764279483; bh=J/Cd6H6DLpMMXY1wyttaMvCbQYILdLOCg4qVpGR/P3c=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=e30rOSDiIWlFkeJGoC6FSrfKFIV3ptx1axChrCfvSfpxBMreVwGBiCEuuvRwlb7g5 YPmAWAXLs494R51+c+p8IKr5sE+g45KoJAf4Wcc52k1jKRHIL3TfHw5+L5bG4ehp2f kNjVG5nwvjgyXyf6nWsH5IQa21z6HgCC8n7t58fMrfkivkm6EEgQKqsQXOEuDcSkX1 p84Ea2jueBwKx6c2nPIfx88wt6FsUyZ8vMddY6WMdrnpclPQABdzt8wurozv7t/e7N Uk9YdEN6o5sJWEitfSnpSSNTD6on63sOYcHJvfjZUpEyFyTtmyhyXe4kLIxdWvAl8D UN2wH2lefe+Ig== From: Pratyush Yadav To: Usama Arif Cc: rppt@kernel.org, Andrew Morton , kas@kernel.org, changyuanl@google.com, graf@amazon.com, leitao@debian.org, thevlad@meta.com, pratyush@kernel.org, dave.hansen@linux.intel.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@meta.com Subject: Re: [PATCH v2 2/2] mm/memblock: only mark/clear KHO scratch memory when needed In-Reply-To: <20251127203724.3177621-3-usamaarif642@gmail.com> (Usama Arif's message of "Thu, 27 Nov 2025 20:33:20 +0000") References: <20251127203724.3177621-1-usamaarif642@gmail.com> <20251127203724.3177621-3-usamaarif642@gmail.com> Date: Thu, 27 Nov 2025 22:37:55 +0100 Message-ID: <867bvbyx58.fsf@kernel.org> User-Agent: Gnus/5.13 (Gnus v5.13) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain On Thu, Nov 27 2025, Usama Arif wrote: > The scratch memory for kexec handover is used to bootstrap the > kexec'ed kernel. It is only needed when CONFIG_KEXEC_HANDOVER > is enabled and only if it is a KHO boot. Add checks 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 > --- > mm/memblock.c | 74 ++++++++++++++++++++++++++++++--------------------- > 1 file changed, 44 insertions(+), 30 deletions(-) > > diff --git a/mm/memblock.c b/mm/memblock.c > index 8b13d5c28922a..8a2cebcfe0a18 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -1114,36 +1114,6 @@ int __init_memblock memblock_reserved_mark_noinit(phys_addr_t base, phys_addr_t > MEMBLOCK_RSRV_NOINIT); > } > > -/** > - * memblock_mark_kho_scratch - Mark a memory region as MEMBLOCK_KHO_SCRATCH. > - * @base: the base phys addr of the region > - * @size: the size of the region > - * > - * Only memory regions marked with %MEMBLOCK_KHO_SCRATCH will be considered > - * for allocations during early boot with kexec handover. > - * > - * Return: 0 on success, -errno on failure. > - */ > -__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); > -} > - > -/** > - * memblock_clear_kho_scratch - Clear MEMBLOCK_KHO_SCRATCH flag for a > - * specified region. > - * @base: the base phys addr of the region > - * @size: the size of the region > - * > - * Return: 0 on success, -errno on failure. > - */ > -__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); > -} > - > static bool should_skip_region(struct memblock_type *type, > struct memblock_region *m, > int nid, int flags) > @@ -2617,12 +2587,56 @@ static bool __init reserve_mem_kho_revive(const char *name, phys_addr_t size, > > return true; > } > + > +/** > + * memblock_mark_kho_scratch - Mark a memory region as MEMBLOCK_KHO_SCRATCH. > + * @base: the base phys addr of the region > + * @size: the size of the region > + * > + * Only memory regions marked with %MEMBLOCK_KHO_SCRATCH will be considered > + * for allocations during early boot with kexec handover. > + * > + * Return: 0 on success, -errno on failure. > + */ > +__init int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size) > +{ > + if (is_kho_boot()) > + return memblock_setclr_flag(&memblock.memory, base, size, 1, > + MEMBLOCK_KHO_SCRATCH); > + return 0; > +} > + > +/** > + * memblock_clear_kho_scratch - Clear MEMBLOCK_KHO_SCRATCH flag for a > + * specified region. > + * @base: the base phys addr of the region > + * @size: the size of the region > + * > + * Return: 0 on success, -errno on failure. > + */ > +__init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size) > +{ > + if (is_kho_boot()) > + return memblock_setclr_flag(&memblock.memory, base, size, 0, > + MEMBLOCK_KHO_SCRATCH); > + return 0; > +} > #else > static bool __init reserve_mem_kho_revive(const char *name, phys_addr_t size, > phys_addr_t align) > { > return false; > } > + > +__init int memblock_mark_kho_scratch(phys_addr_t base, phys_addr_t size) > +{ > + return 0; > +} > + > +__init int memblock_clear_kho_scratch(phys_addr_t base, phys_addr_t size) > +{ > + return 0; > +} Nit: I don't think we need the alternate version here. When CONFIG_KEXEC_HANDOVER is disabled, is_kho_boot() is static inline bool is_kho_boot(void) { return false; } So the above functions work for both cases. I would prefer to not have two variants, but I don't think it is a blocker. Up to you. Reviewed-by: Pratyush Yadav > #endif /* CONFIG_KEXEC_HANDOVER */ > > /* -- Regards, Pratyush Yadav