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 > >
