On Mon, Dec 15, 2025 at 03:51:56PM -0500, Peter Xu wrote:
> This name is too generic, and can conflict with in-place guest-memfd
> support.  Add a _PRIVATE suffix to show what it really means: it is always
> silently using an internal guest-memfd to back a shared host backend,
> rather than used in-place.
> 
> This paves way for in-place guest-memfd, which means we can have a ramblock
> that allocates pages completely from guest-memfd (private or shared).
> 
> Reviewed-by: Xiaoyao Li <[email protected]>
> Signed-off-by: Peter Xu <[email protected]>

Reviewed-by: Michael Roth <[email protected]>

> ---
>  include/system/memory.h   | 8 ++++----
>  include/system/ram_addr.h | 2 +-
>  backends/hostmem-file.c   | 2 +-
>  backends/hostmem-memfd.c  | 2 +-
>  backends/hostmem-ram.c    | 2 +-
>  backends/hostmem-shm.c    | 2 +-
>  system/memory.c           | 3 ++-
>  system/physmem.c          | 8 ++++----
>  8 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/include/system/memory.h b/include/system/memory.h
> index 2384575065..1f49f9a0ff 100644
> --- a/include/system/memory.h
> +++ b/include/system/memory.h
> @@ -263,7 +263,7 @@ typedef struct IOMMUTLBEvent {
>  #define RAM_READONLY_FD (1 << 11)
>  
>  /* RAM can be private that has kvm guest memfd backend */
> -#define RAM_GUEST_MEMFD   (1 << 12)
> +#define RAM_GUEST_MEMFD_PRIVATE   (1 << 12)
>  
>  /*
>   * In RAMBlock creation functions, if MAP_SHARED is 0 in the flags parameter,
> @@ -1401,7 +1401,7 @@ bool memory_region_init_ram_nomigrate(MemoryRegion *mr,
>   *        must be unique within any device
>   * @size: size of the region.
>   * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_NORESERVE,
> - *             RAM_GUEST_MEMFD.
> + *             RAM_GUEST_MEMFD_PRIVATE.
>   * @errp: pointer to Error*, to store an error if it happens.
>   *
>   * Note that this function does not do anything to cause the data in the
> @@ -1463,7 +1463,7 @@ bool memory_region_init_resizeable_ram(MemoryRegion *mr,
>   *         (getpagesize()) will be used.
>   * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM,
>   *             RAM_NORESERVE, RAM_PROTECTED, RAM_NAMED_FILE, RAM_READONLY,
> - *             RAM_READONLY_FD, RAM_GUEST_MEMFD
> + *             RAM_READONLY_FD, RAM_GUEST_MEMFD_PRIVATE
>   * @path: the path in which to allocate the RAM.
>   * @offset: offset within the file referenced by path
>   * @errp: pointer to Error*, to store an error if it happens.
> @@ -1493,7 +1493,7 @@ bool memory_region_init_ram_from_file(MemoryRegion *mr,
>   * @size: size of the region.
>   * @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM,
>   *             RAM_NORESERVE, RAM_PROTECTED, RAM_NAMED_FILE, RAM_READONLY,
> - *             RAM_READONLY_FD, RAM_GUEST_MEMFD
> + *             RAM_READONLY_FD, RAM_GUEST_MEMFD_PRIVATE
>   * @fd: the fd to mmap.
>   * @offset: offset within the file referenced by fd
>   * @errp: pointer to Error*, to store an error if it happens.
> diff --git a/include/system/ram_addr.h b/include/system/ram_addr.h
> index 683485980c..930d3824d7 100644
> --- a/include/system/ram_addr.h
> +++ b/include/system/ram_addr.h
> @@ -92,7 +92,7 @@ static inline unsigned long int 
> ramblock_recv_bitmap_offset(void *host_addr,
>   *  @resized: callback after calls to qemu_ram_resize
>   *  @ram_flags: RamBlock flags. Supported flags: RAM_SHARED, RAM_PMEM,
>   *              RAM_NORESERVE, RAM_PROTECTED, RAM_NAMED_FILE, RAM_READONLY,
> - *              RAM_READONLY_FD, RAM_GUEST_MEMFD
> + *              RAM_READONLY_FD, RAM_GUEST_MEMFD_PRIVATE
>   *  @mem_path or @fd: specify the backing file or device
>   *  @offset: Offset into target file
>   *  @grow: extend file if necessary (but an empty file is always extended).
> diff --git a/backends/hostmem-file.c b/backends/hostmem-file.c
> index 8e3219c061..1f20cd8fd6 100644
> --- a/backends/hostmem-file.c
> +++ b/backends/hostmem-file.c
> @@ -86,7 +86,7 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error 
> **errp)
>      ram_flags |= fb->readonly ? RAM_READONLY_FD : 0;
>      ram_flags |= fb->rom == ON_OFF_AUTO_ON ? RAM_READONLY : 0;
>      ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
> -    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD : 0;
> +    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD_PRIVATE : 0;
>      ram_flags |= fb->is_pmem ? RAM_PMEM : 0;
>      ram_flags |= RAM_NAMED_FILE;
>      return memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), 
> name,
> diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
> index 923239f9cf..3f3e485709 100644
> --- a/backends/hostmem-memfd.c
> +++ b/backends/hostmem-memfd.c
> @@ -60,7 +60,7 @@ have_fd:
>      backend->aligned = true;
>      ram_flags = backend->share ? RAM_SHARED : RAM_PRIVATE;
>      ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
> -    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD : 0;
> +    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD_PRIVATE : 0;
>      return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), 
> name,
>                                            backend->size, ram_flags, fd, 0, 
> errp);
>  }
> diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c
> index 062b1abb11..96ad29112d 100644
> --- a/backends/hostmem-ram.c
> +++ b/backends/hostmem-ram.c
> @@ -30,7 +30,7 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error 
> **errp)
>      name = host_memory_backend_get_name(backend);
>      ram_flags = backend->share ? RAM_SHARED : RAM_PRIVATE;
>      ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
> -    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD : 0;
> +    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD_PRIVATE : 0;
>      return memory_region_init_ram_flags_nomigrate(&backend->mr, 
> OBJECT(backend),
>                                                    name, backend->size,
>                                                    ram_flags, errp);
> diff --git a/backends/hostmem-shm.c b/backends/hostmem-shm.c
> index 806e2670e0..e86fb2e0aa 100644
> --- a/backends/hostmem-shm.c
> +++ b/backends/hostmem-shm.c
> @@ -54,7 +54,7 @@ have_fd:
>      /* Let's do the same as memory-backend-ram,share=on would do. */
>      ram_flags = RAM_SHARED;
>      ram_flags |= backend->reserve ? 0 : RAM_NORESERVE;
> -    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD : 0;
> +    ram_flags |= backend->guest_memfd ? RAM_GUEST_MEMFD_PRIVATE : 0;
>  
>      return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend),
>                                                backend_name, backend->size,
> diff --git a/system/memory.c b/system/memory.c
> index 355b1fa26b..e8c6d484e6 100644
> --- a/system/memory.c
> +++ b/system/memory.c
> @@ -3755,7 +3755,8 @@ bool memory_region_init_ram_guest_memfd(MemoryRegion 
> *mr,
>      DeviceState *owner_dev;
>  
>      if (!memory_region_init_ram_flags_nomigrate(mr, owner, name, size,
> -                                                RAM_GUEST_MEMFD, errp)) {
> +                                                RAM_GUEST_MEMFD_PRIVATE,
> +                                                errp)) {
>          return false;
>      }
>      /* This will assert if owner is neither NULL nor a DeviceState.
> diff --git a/system/physmem.c b/system/physmem.c
> index c3c7a81310..d30fd690d1 100644
> --- a/system/physmem.c
> +++ b/system/physmem.c
> @@ -2203,7 +2203,7 @@ static void ram_block_add(RAMBlock *new_block, Error 
> **errp)
>          }
>      }
>  
> -    if (new_block->flags & RAM_GUEST_MEMFD) {
> +    if (new_block->flags & RAM_GUEST_MEMFD_PRIVATE) {
>          int ret;
>  
>          if (!kvm_enabled()) {
> @@ -2341,7 +2341,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, 
> ram_addr_t max_size,
>      /* Just support these ram flags by now. */
>      assert((ram_flags & ~(RAM_SHARED | RAM_PMEM | RAM_NORESERVE |
>                            RAM_PROTECTED | RAM_NAMED_FILE | RAM_READONLY |
> -                          RAM_READONLY_FD | RAM_GUEST_MEMFD |
> +                          RAM_READONLY_FD | RAM_GUEST_MEMFD_PRIVATE |
>                            RAM_RESIZEABLE)) == 0);
>      assert(max_size >= size);
>  
> @@ -2498,7 +2498,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, 
> ram_addr_t max_size,
>      ram_flags &= ~RAM_PRIVATE;
>  
>      assert((ram_flags & ~(RAM_SHARED | RAM_RESIZEABLE | RAM_PREALLOC |
> -                          RAM_NORESERVE | RAM_GUEST_MEMFD)) == 0);
> +                          RAM_NORESERVE | RAM_GUEST_MEMFD_PRIVATE)) == 0);
>      assert(!host ^ (ram_flags & RAM_PREALLOC));
>      assert(max_size >= size);
>  
> @@ -2581,7 +2581,7 @@ RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void 
> *host,
>  RAMBlock *qemu_ram_alloc(ram_addr_t size, uint32_t ram_flags,
>                           MemoryRegion *mr, Error **errp)
>  {
> -    assert((ram_flags & ~(RAM_SHARED | RAM_NORESERVE | RAM_GUEST_MEMFD |
> +    assert((ram_flags & ~(RAM_SHARED | RAM_NORESERVE | 
> RAM_GUEST_MEMFD_PRIVATE |
>                            RAM_PRIVATE)) == 0);
>      return qemu_ram_alloc_internal(size, size, NULL, NULL, ram_flags, mr, 
> errp);
>  }
> -- 
> 2.50.1
> 
> 

Reply via email to