[PULL 07/42] machine: aux-ram-share option

Fabiano Rosas posted 42 patches 1 year ago
[PULL 07/42] machine: aux-ram-share option
Posted by Fabiano Rosas 1 year ago
From: Steve Sistare <steven.sistare@oracle.com>

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>
---
 hw/core/machine.c   | 22 ++++++++++++++++++++++
 include/hw/boards.h |  1 +
 qemu-options.hx     | 11 +++++++++++
 system/physmem.c    |  3 +++
 4 files changed, 37 insertions(+)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index c23b399496..2b11bc4f66 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -457,6 +457,22 @@ static void machine_set_mem_merge(Object *obj, bool value, Error **errp)
     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)
 {
     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",
         "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 2ad711e56d..e1f41b2a53 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 7090d59f6f..90fad31590 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 03fac0a64f..cb80ce3091 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);
-- 
2.35.3
Re: [PULL 07/42] machine: aux-ram-share option
Posted by Peter Maydell 3 months, 1 week ago
On Wed, 29 Jan 2025 at 16:03, Fabiano Rosas <farosas@suse.de> wrote:
>
> From: Steve Sistare <steven.sistare@oracle.com>
>
> 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.

Hi; I've just noticed that in this patch:


> @@ -1162,6 +1178,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

we added a new class property to the machine, but we don't
call object_class_property_set_description() to give it any
help text (compare how we handle the other properties in this
function).

> +
>      object_class_property_add_bool(oc, "usb",
>          machine_get_usb, machine_set_usb);
>      object_class_property_set_description(oc, "usb",

This means that if you run "qemu-system-x86_64 -M q35,help"
you'll see that this option is missing help text:

pc-q35-10.2-machine options:
  acpi=<OnOffAuto>       - Enable ACPI
  append=<string>        - Linux kernel command line
  aux-ram-share=<bool>
  boot=<BootConfiguration> - Boot configuration
  bus-lock-ratelimit=<uint64_t> - Set the ratelimit for the bus locks
acquired in VMs
  confidential-guest-support=<link<confidential-guest-support>> - Set
confidential guest scheme to support
  default-bus-bypass-iommu=<bool>
[etc]

Would somebody like to write a patch to add the missing
description ?

thanks
-- PMM
Re: [PULL 07/42] machine: aux-ram-share option
Posted by Peter Xu 3 months ago
On Tue, Nov 04, 2025 at 10:53:54AM +0000, Peter Maydell wrote:
> On Wed, 29 Jan 2025 at 16:03, Fabiano Rosas <farosas@suse.de> wrote:
> >
> > From: Steve Sistare <steven.sistare@oracle.com>
> >
> > 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.
> 
> Hi; I've just noticed that in this patch:
> 
> 
> > @@ -1162,6 +1178,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
> 
> we added a new class property to the machine, but we don't
> call object_class_property_set_description() to give it any
> help text (compare how we handle the other properties in this
> function).
> 
> > +
> >      object_class_property_add_bool(oc, "usb",
> >          machine_get_usb, machine_set_usb);
> >      object_class_property_set_description(oc, "usb",
> 
> This means that if you run "qemu-system-x86_64 -M q35,help"
> you'll see that this option is missing help text:
> 
> pc-q35-10.2-machine options:
>   acpi=<OnOffAuto>       - Enable ACPI
>   append=<string>        - Linux kernel command line
>   aux-ram-share=<bool>
>   boot=<BootConfiguration> - Boot configuration
>   bus-lock-ratelimit=<uint64_t> - Set the ratelimit for the bus locks
> acquired in VMs
>   confidential-guest-support=<link<confidential-guest-support>> - Set
> confidential guest scheme to support
>   default-bus-bypass-iommu=<bool>
> [etc]
> 
> Would somebody like to write a patch to add the missing
> description ?

Thanks for reporting, sent "[PATCH] machine: Provide a description for
aux-ram-share property" just now.

PS: for q35 there's another one fd-bootchk=..

-- 
Peter Xu
Re: [PULL 07/42] machine: aux-ram-share option
Posted by Peter Maydell 3 months ago
On Wed, 5 Nov 2025 at 19:13, Peter Xu <peterx@redhat.com> wrote:
>
> On Tue, Nov 04, 2025 at 10:53:54AM +0000, Peter Maydell wrote:
> > On Wed, 29 Jan 2025 at 16:03, Fabiano Rosas <farosas@suse.de> wrote:
> > >
> > > From: Steve Sistare <steven.sistare@oracle.com>
> > >
> > > 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.
> >
> > Hi; I've just noticed that in this patch:
> >
> >
> > > @@ -1162,6 +1178,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
> >
> > we added a new class property to the machine, but we don't
> > call object_class_property_set_description() to give it any
> > help text (compare how we handle the other properties in this
> > function).
> >
> > > +
> > >      object_class_property_add_bool(oc, "usb",
> > >          machine_get_usb, machine_set_usb);
> > >      object_class_property_set_description(oc, "usb",
> >
> > This means that if you run "qemu-system-x86_64 -M q35,help"
> > you'll see that this option is missing help text:
> >
> > pc-q35-10.2-machine options:
> >   acpi=<OnOffAuto>       - Enable ACPI
> >   append=<string>        - Linux kernel command line
> >   aux-ram-share=<bool>
> >   boot=<BootConfiguration> - Boot configuration
> >   bus-lock-ratelimit=<uint64_t> - Set the ratelimit for the bus locks
> > acquired in VMs
> >   confidential-guest-support=<link<confidential-guest-support>> - Set
> > confidential guest scheme to support
> >   default-bus-bypass-iommu=<bool>
> > [etc]
> >
> > Would somebody like to write a patch to add the missing
> > description ?
>
> Thanks for reporting, sent "[PATCH] machine: Provide a description for
> aux-ram-share property" just now.
>
> PS: for q35 there's another one fd-bootchk=..

Yes; it was looking at the bug report about that
https://gitlab.com/qemu-project/qemu/-/issues/3193
that led me to spot the aux-ram-share option.

-- PMM