From: "Pratik R. Sampat" <prsampat@amd.com>
To: <linux-mm@kvack.org>, <linux-coco@lists.linux.dev>,
<x86@kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <tglx@linutronix.de>, <mingo@redhat.com>, <bp@alien8.de>,
<dave.hansen@linux.intel.com>, <kas@kernel.org>,
<ardb@kernel.org>, <akpm@linux-foundation.org>,
<david@kernel.org>, <osalvador@suse.de>,
<thomas.lendacky@amd.com>, <michael.roth@amd.com>,
<prsampat@amd.com>
Subject: [PATCH v4 1/2] mm/memory_hotplug: Add support to accept memory during hot-add
Date: Tue, 3 Feb 2026 11:49:45 -0600 [thread overview]
Message-ID: <20260203174946.1198053-2-prsampat@amd.com> (raw)
In-Reply-To: <20260203174946.1198053-1-prsampat@amd.com>
Confidential computing guests require memory to be accepted before use.
The unaccepted memory bitmap maintained by firmware does not track
most hotplugged memory ranges apart from system memory annotated to be
cold plugged at boot.
Explicitly validate and transition the newly added memory to a private
state, making it usable by the guest.
Signed-off-by: Pratik R. Sampat <prsampat@amd.com>
---
drivers/firmware/efi/unaccepted_memory.c | 47 ++++++++++++++++++++++++
include/linux/mm.h | 5 +++
mm/memory_hotplug.c | 2 +
3 files changed, 54 insertions(+)
diff --git a/drivers/firmware/efi/unaccepted_memory.c b/drivers/firmware/efi/unaccepted_memory.c
index c2c067eff634..359779133cb4 100644
--- a/drivers/firmware/efi/unaccepted_memory.c
+++ b/drivers/firmware/efi/unaccepted_memory.c
@@ -209,6 +209,53 @@ bool range_contains_unaccepted_memory(phys_addr_t start, unsigned long size)
return ret;
}
+/*
+ * Unaccepted memory bitmap only covers initial boot memory and not the
+ * hotpluggable range that is part of SRAT parsing. However, some initial memory
+ * with the attribute EFI_MEMORY_HOT_PLUGGABLE can indicate boot time memory
+ * that can be hot-removed. Hence post acceptance, only for that range update
+ * the unaccepted bitmap to reflect this change.
+ */
+void accept_hotplug_memory(phys_addr_t start, unsigned long size)
+{
+ struct efi_unaccepted_memory *unaccepted;
+ unsigned long range_start, range_len;
+ phys_addr_t end = start + size;
+ u64 phys_base, unit_size;
+ unsigned long flags;
+
+ unaccepted = efi_get_unaccepted_table();
+ if (!unaccepted)
+ return;
+
+ /* Accept hotplug range unconditionally */
+ arch_accept_memory(start, end);
+
+ phys_base = unaccepted->phys_base;
+ unit_size = unaccepted->unit_size;
+
+ /* Only update bitmap for the region that is represented by it */
+ if (start >= phys_base + unaccepted->size * unit_size * BITS_PER_BYTE)
+ return;
+
+ start = max(start, phys_base);
+ if (end < phys_base)
+ return;
+
+ start -= phys_base;
+ end -= phys_base;
+
+ /* Make sure not to overrun the bitmap */
+ end = min(end, unaccepted->size * unit_size * BITS_PER_BYTE);
+
+ range_start = start / unit_size;
+ range_len = DIV_ROUND_UP(end, unit_size) - range_start;
+
+ spin_lock_irqsave(&unaccepted_memory_lock, flags);
+ bitmap_clear(unaccepted->bitmap, range_start, range_len);
+ spin_unlock_irqrestore(&unaccepted_memory_lock, flags);
+}
+
#ifdef CONFIG_PROC_VMCORE
static bool unaccepted_memory_vmcore_pfn_is_ram(struct vmcore_cb *cb,
unsigned long pfn)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 15076261d0c2..2d3c1ea40606 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -4504,6 +4504,7 @@ int set_anon_vma_name(unsigned long addr, unsigned long size,
bool range_contains_unaccepted_memory(phys_addr_t start, unsigned long size);
void accept_memory(phys_addr_t start, unsigned long size);
+void accept_hotplug_memory(phys_addr_t start, unsigned long size);
#else
@@ -4517,6 +4518,10 @@ static inline void accept_memory(phys_addr_t start, unsigned long size)
{
}
+static inline void accept_hotplug_memory(phys_addr_t start, unsigned long size)
+{
+}
+
#endif
static inline bool pfn_is_unaccepted_memory(unsigned long pfn)
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index a63ec679d861..549ccfd190ee 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1567,6 +1567,8 @@ int add_memory_resource(int nid, struct resource *res, mhp_t mhp_flags)
if (!strcmp(res->name, "System RAM"))
firmware_map_add_hotplug(start, start + size, "System RAM");
+ accept_hotplug_memory(start, size);
+
/* device_online() will take the lock when calling online_pages() */
mem_hotplug_done();
--
2.52.0
next prev parent reply other threads:[~2026-02-03 17:50 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-03 17:49 [PATCH v4 0/2] SEV-SNP Unaccepted Memory Hotplug Pratik R. Sampat
2026-02-03 17:49 ` Pratik R. Sampat [this message]
2026-02-04 11:22 ` [PATCH v4 1/2] mm/memory_hotplug: Add support to accept memory during hot-add Kiryl Shutsemau
2026-02-04 19:59 ` David Hildenbrand (arm)
2026-02-05 3:50 ` Pratik R. Sampat
2026-02-05 10:51 ` Kiryl Shutsemau
2026-02-04 20:00 ` David Hildenbrand (arm)
2026-02-05 3:50 ` Pratik R. Sampat
2026-02-05 10:48 ` Kiryl Shutsemau
2026-02-05 15:48 ` David Hildenbrand (Arm)
2026-02-05 16:08 ` Kiryl Shutsemau
2026-02-05 17:29 ` David Hildenbrand (Arm)
2026-02-06 12:03 ` Kiryl Shutsemau
2026-02-16 14:45 ` Pratik R. Sampat
2026-02-03 17:49 ` [PATCH v4 2/2] x86/sev: Add support to unaccept memory after hot-remove Pratik R. Sampat
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260203174946.1198053-2-prsampat@amd.com \
--to=prsampat@amd.com \
--cc=akpm@linux-foundation.org \
--cc=ardb@kernel.org \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=david@kernel.org \
--cc=kas@kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=michael.roth@amd.com \
--cc=mingo@redhat.com \
--cc=osalvador@suse.de \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox