Procházet zdrojové kódy

machine: aux-ram-share option

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>
Link: https://lore.kernel.org/r/1736967650-129648-7-git-send-email-steven.sistare@oracle.com
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Steve Sistare před 7 měsíci
rodič
revize
91792807d1
4 změnil soubory, kde provedl 37 přidání a 0 odebrání
  1. 22 0
      hw/core/machine.c
  2. 1 0
      include/hw/boards.h
  3. 11 0
      qemu-options.hx
  4. 3 0
      system/physmem.c

+ 22 - 0
hw/core/machine.c

@@ -457,6 +457,22 @@ static void machine_set_mem_merge(Object *obj, bool value, Error **errp)
     ms->mem_merge = value;
     ms->mem_merge = value;
 }
 }
 
 
+#ifdef CONFIG_POSIX
+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;
+}
+#endif
+
 static bool machine_get_usb(Object *obj, Error **errp)
 static bool machine_get_usb(Object *obj, Error **errp)
 {
 {
     MachineState *ms = MACHINE(obj);
     MachineState *ms = MACHINE(obj);
@@ -1162,6 +1178,12 @@ static void machine_class_init(ObjectClass *oc, void *data)
     object_class_property_set_description(oc, "mem-merge",
     object_class_property_set_description(oc, "mem-merge",
         "Enable/disable memory merge support");
         "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",
     object_class_property_add_bool(oc, "usb",
         machine_get_usb, machine_set_usb);
         machine_get_usb, machine_set_usb);
     object_class_property_set_description(oc, "usb",
     object_class_property_set_description(oc, "usb",

+ 1 - 0
include/hw/boards.h

@@ -410,6 +410,7 @@ struct MachineState {
     bool enable_graphics;
     bool enable_graphics;
     ConfidentialGuestSupport *cgs;
     ConfidentialGuestSupport *cgs;
     HostMemoryBackend *memdev;
     HostMemoryBackend *memdev;
+    bool aux_ram_share;
     /*
     /*
      * convenience alias to ram_memdev_id backend memory region
      * convenience alias to ram_memdev_id backend memory region
      * or to numa container memory region
      * or to numa container memory region

+ 11 - 0
qemu-options.hx

@@ -38,6 +38,9 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
     "                nvdimm=on|off controls NVDIMM support (default=off)\n"
     "                nvdimm=on|off controls NVDIMM support (default=off)\n"
     "                memory-encryption=@var{} memory encryption object to use (default=none)\n"
     "                memory-encryption=@var{} memory encryption object to use (default=none)\n"
     "                hmat=on|off controls ACPI HMAT support (default=off)\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"
     "                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",
     "                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)
     QEMU_ARCH_ALL)
@@ -101,6 +104,14 @@ SRST
         Enables or disables ACPI Heterogeneous Memory Attribute Table
         Enables or disables ACPI Heterogeneous Memory Attribute Table
         (HMAT) support. The default is off.
         (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'``
     ``memory-backend='id'``
         An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
         An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
         Allows to use a memory backend as main RAM.
         Allows to use a memory backend as main RAM.

+ 3 - 0
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 */
 #ifdef CONFIG_POSIX         /* ignore RAM_SHARED for Windows */
     if (!host) {
     if (!host) {
+        if (!share_flags && current_machine->aux_ram_share) {
+            ram_flags |= RAM_SHARED;
+        }
         if (ram_flags & RAM_SHARED) {
         if (ram_flags & RAM_SHARED) {
             const char *name = memory_region_name(mr);
             const char *name = memory_region_name(mr);
             int fd = qemu_ram_get_shared_fd(name, errp);
             int fd = qemu_ram_get_shared_fd(name, errp);