[PATCH v4 45/66] memory: Introduce memory_region_init_ram_guest_memfd()

Xiaoyao Li posted 66 patches 10 months ago
There is a newer version of this series
[PATCH v4 45/66] memory: Introduce memory_region_init_ram_guest_memfd()
Posted by Xiaoyao Li 10 months ago
Introduce memory_region_init_ram_guest_memfd() to allocate private
guset memfd on the MemoryRegion initialization. It's for the use case of
TDVF, which must be private on TDX case.

Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
---
 include/exec/memory.h |  6 ++++++
 system/memory.c       | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/include/exec/memory.h b/include/exec/memory.h
index f25959f6d30f..3a7f41b030e8 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -1607,6 +1607,12 @@ bool memory_region_init_ram(MemoryRegion *mr,
                             uint64_t size,
                             Error **errp);
 
+bool memory_region_init_ram_guest_memfd(MemoryRegion *mr,
+                                        Object *owner,
+                                        const char *name,
+                                        uint64_t size,
+                                        Error **errp);
+
 /**
  * memory_region_init_rom: Initialize a ROM memory region.
  *
diff --git a/system/memory.c b/system/memory.c
index 74f647f2e56f..41049d3e4c9a 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -3619,6 +3619,33 @@ bool memory_region_init_ram(MemoryRegion *mr,
     return true;
 }
 
+bool memory_region_init_ram_guest_memfd(MemoryRegion *mr,
+                                        Object *owner,
+                                        const char *name,
+                                        uint64_t size,
+                                        Error **errp)
+{
+    DeviceState *owner_dev;
+
+    if (!memory_region_init_ram_flags_nomigrate(mr, owner, name, size,
+                                                RAM_GUEST_MEMFD, errp)) {
+        return false;
+    }
+
+    memory_region_set_default_private(mr);
+
+    /* This will assert if owner is neither NULL nor a DeviceState.
+     * We only want the owner here for the purposes of defining a
+     * unique name for migration. TODO: Ideally we should implement
+     * a naming scheme for Objects which are not DeviceStates, in
+     * which case we can relax this restriction.
+     */
+    owner_dev = DEVICE(owner);
+    vmstate_register_ram(mr, owner_dev);
+
+    return true;
+}
+
 bool memory_region_init_rom(MemoryRegion *mr,
                             Object *owner,
                             const char *name,
-- 
2.34.1
Re: [PATCH v4 45/66] memory: Introduce memory_region_init_ram_guest_memfd()
Posted by David Hildenbrand 10 months ago
On 25.01.24 04:23, Xiaoyao Li wrote:
> Introduce memory_region_init_ram_guest_memfd() to allocate private
> guset memfd on the MemoryRegion initialization. It's for the use case of
> TDVF, which must be private on TDX case.
> 
> Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
>   include/exec/memory.h |  6 ++++++
>   system/memory.c       | 27 +++++++++++++++++++++++++++
>   2 files changed, 33 insertions(+)
> 
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index f25959f6d30f..3a7f41b030e8 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -1607,6 +1607,12 @@ bool memory_region_init_ram(MemoryRegion *mr,
>                               uint64_t size,
>                               Error **errp);
>   
> +bool memory_region_init_ram_guest_memfd(MemoryRegion *mr,
> +                                        Object *owner,
> +                                        const char *name,
> +                                        uint64_t size,
> +                                        Error **errp);
> +
>   /**
>    * memory_region_init_rom: Initialize a ROM memory region.
>    *
> diff --git a/system/memory.c b/system/memory.c
> index 74f647f2e56f..41049d3e4c9a 100644
> --- a/system/memory.c
> +++ b/system/memory.c
> @@ -3619,6 +3619,33 @@ bool memory_region_init_ram(MemoryRegion *mr,
>       return true;
>   }
>   
> +bool memory_region_init_ram_guest_memfd(MemoryRegion *mr,
> +                                        Object *owner,
> +                                        const char *name,
> +                                        uint64_t size,
> +                                        Error **errp)
> +{
> +    DeviceState *owner_dev;
> +
> +    if (!memory_region_init_ram_flags_nomigrate(mr, owner, name, size,
> +                                                RAM_GUEST_MEMFD, errp)) {
> +        return false;
> +    }
> +
> +    memory_region_set_default_private(mr);

It would be much cleaner to just pass the flag when initializing the 
memory region.

Ideally, we can get rid of memory_region_set_default_private().

What you do in patch #33 feels like a layer violation.

-- 
Cheers,

David / dhildenb