[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH V6 06/24] machine: aux-ram-share option
From: |
Steve Sistare |
Subject: |
[PATCH V6 06/24] machine: aux-ram-share option |
Date: |
Tue, 14 Jan 2025 09:23:36 -0800 |
Allocate auxilliary guest RAM as an anonymous file that is shareable
with an external process. This option applies to memory allocated as
a side effect of creating various devices. It does not apply to
memory-backend-objects, whether explicitly specified on the command
line, or implicitly created by the -m command line option.
This option is intended to support new migration modes, in which the
memory region can be transferred in place to a new QEMU process, by sending
the memfd file descriptor to the process. Memory contents are preserved,
and if the mode also transfers device descriptors, then pages that are
locked in memory for DMA remain locked. This behavior is a pre-requisite
for supporting vfio, vdpa, and iommufd devices with the new modes.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
---
hw/core/machine.c | 20 ++++++++++++++++++++
include/hw/boards.h | 1 +
qemu-options.hx | 11 +++++++++++
system/physmem.c | 3 +++
4 files changed, 35 insertions(+)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index c23b399..57188c5 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -457,6 +457,20 @@ static void machine_set_mem_merge(Object *obj, bool value,
Error **errp)
ms->mem_merge = value;
}
+static bool machine_get_aux_ram_share(Object *obj, Error **errp)
+{
+ MachineState *ms = MACHINE(obj);
+
+ return ms->aux_ram_share;
+}
+
+static void machine_set_aux_ram_share(Object *obj, bool value, Error **errp)
+{
+ MachineState *ms = MACHINE(obj);
+
+ ms->aux_ram_share = value;
+}
+
static bool machine_get_usb(Object *obj, Error **errp)
{
MachineState *ms = MACHINE(obj);
@@ -1162,6 +1176,12 @@ static void machine_class_init(ObjectClass *oc, void
*data)
object_class_property_set_description(oc, "mem-merge",
"Enable/disable memory merge support");
+#ifdef CONFIG_POSIX
+ object_class_property_add_bool(oc, "aux-ram-share",
+ machine_get_aux_ram_share,
+ machine_set_aux_ram_share);
+#endif
+
object_class_property_add_bool(oc, "usb",
machine_get_usb, machine_set_usb);
object_class_property_set_description(oc, "usb",
diff --git a/include/hw/boards.h b/include/hw/boards.h
index 2ad711e..e1f41b2 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -410,6 +410,7 @@ struct MachineState {
bool enable_graphics;
ConfidentialGuestSupport *cgs;
HostMemoryBackend *memdev;
+ bool aux_ram_share;
/*
* convenience alias to ram_memdev_id backend memory region
* or to numa container memory region
diff --git a/qemu-options.hx b/qemu-options.hx
index 7090d59..90fad31 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -38,6 +38,9 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
" nvdimm=on|off controls NVDIMM support (default=off)\n"
" memory-encryption=@var{} memory encryption object to use
(default=none)\n"
" hmat=on|off controls ACPI HMAT support (default=off)\n"
+#ifdef CONFIG_POSIX
+ " aux-ram-share=on|off allocate auxiliary guest RAM as
shared (default: off)\n"
+#endif
" memory-backend='backend-id' specifies explicitly provided
backend for main RAM (default=none)\n"
"
cxl-fmw.0.targets.0=firsttarget,cxl-fmw.0.targets.1=secondtarget,cxl-fmw.0.size=size[,cxl-fmw.0.interleave-granularity=granularity]\n",
QEMU_ARCH_ALL)
@@ -101,6 +104,14 @@ SRST
Enables or disables ACPI Heterogeneous Memory Attribute Table
(HMAT) support. The default is off.
+ ``aux-ram-share=on|off``
+ Allocate auxiliary guest RAM as an anonymous file that is
+ shareable with an external process. This option applies to
+ memory allocated as a side effect of creating various devices.
+ It does not apply to memory-backend-objects, whether explicitly
+ specified on the command line, or implicitly created by the -m
+ command line option. The default is off.
+
``memory-backend='id'``
An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
Allows to use a memory backend as main RAM.
diff --git a/system/physmem.c b/system/physmem.c
index 03fac0a..cb80ce3 100644
--- a/system/physmem.c
+++ b/system/physmem.c
@@ -2114,6 +2114,9 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size,
ram_addr_t max_size,
#ifdef CONFIG_POSIX /* ignore RAM_SHARED for Windows */
if (!host) {
+ if (!share_flags && current_machine->aux_ram_share) {
+ ram_flags |= RAM_SHARED;
+ }
if (ram_flags & RAM_SHARED) {
const char *name = memory_region_name(mr);
int fd = qemu_ram_get_shared_fd(name, errp);
--
1.8.3.1
- [PATCH V6 00/24] Live update: cpr-transfer, Steve Sistare, 2025/01/14
- [PATCH V6 01/24] backends/hostmem-shm: factor out allocation of "anonymous shared memory with an fd", Steve Sistare, 2025/01/14
- [PATCH V6 05/24] memory: add RAM_PRIVATE, Steve Sistare, 2025/01/14
- [PATCH V6 03/24] physmem: qemu_ram_alloc_from_fd extensions, Steve Sistare, 2025/01/14
- [PATCH V6 02/24] physmem: fix qemu_ram_alloc_from_fd size calculation, Steve Sistare, 2025/01/14
- [PATCH V6 04/24] physmem: fd-based shared memory, Steve Sistare, 2025/01/14
- [PATCH V6 07/24] migration: cpr-state, Steve Sistare, 2025/01/14
- [PATCH V6 06/24] machine: aux-ram-share option,
Steve Sistare <=
- [PATCH V6 09/24] hostmem-memfd: preserve for cpr, Steve Sistare, 2025/01/14
- [PATCH V6 08/24] physmem: preserve ram blocks for cpr, Steve Sistare, 2025/01/14
- [PATCH V6 10/24] hostmem-shm: preserve for cpr, Steve Sistare, 2025/01/14
- [PATCH V6 18/24] tests/qtest: optimize migrate_set_ports, Steve Sistare, 2025/01/14
- [PATCH V6 12/24] migration: incoming channel, Steve Sistare, 2025/01/14
- [PATCH V6 20/24] migration-test: defer connection, Steve Sistare, 2025/01/14
- [PATCH V6 24/24] migration: cpr-transfer documentation, Steve Sistare, 2025/01/14
- [PATCH V6 11/24] migration: enhance migrate_uri_parse, Steve Sistare, 2025/01/14
- [PATCH V6 22/24] tests/qtest: assert qmp connected, Steve Sistare, 2025/01/14