On 5/28/2026 8:03 AM, Michael Roth wrote:
This patchset is also available at:

   https://github.com/amdese/qemu/commits/snp-inplace-rfc1

which is in turn based on the following series:

   [PATCH 0/4] "guest_memfd: Fix handling for conversions of MMIO ranges"
   https://lists.gnu.org/archive/html/qemu-devel/2026-05/msg07547.html


OVERVIEW
--------

This series adds guest_memfd support for in-place conversion of memory
between private/shared, and enables it for SEV-SNP guests. It is based
on recently-added kernel support for mmap()-able guest_memfd
instances[1], which allow it to be used for shared memory, and the
following patchset[2], which adds additional guest_memfd interfaces to
allow it to be used to perform in-place conversion:

   "[PATCH v7 00/42] guest_memfd: In-place conversion support"
   
https://lore.kernel.org/kvm/[email protected]/

That series also introduces a new 'vm_memory_attributes' KVM
module option, which sets whether memory attributes are tracked
VM-wide by KVM (vm_memory_attributes=1: the existing 'legacy' mode),
or per-guest_memfd instance (vm_memory_attributes=0: the new mode
which allows for in-place conversion). The latter is intended to
eventually deprecate the legacy mode, at which point in-place
conversion would become the primarily-supported mode.


MOTIVATION
----------

Today, SEV-SNP guests (and other CoCo VM types using guest_memfd) keep
shared and private memory on separate physical backings: a userspace
memory-backend object for shared pages, and a kernel-allocated
guest_memfd file descriptor for private pages. KVM_SET_MEMORY_ATTRIBUTES
flips which backing the guest sees for a given GPA range, and the old
backing is typically discarded / hole-punched on conversion to avoid
doubled memory usage.

That model works, but has a number of downsides that impact certain
use-cases:

   - Each conversion involves discarding pages on one side and faulting
     them in on the other, which incurs allocation overheads in the
     host kernel for every conversion.

   - Some use-cases, like pKVM[3], rely on memory isolation rather than
     encryption and rely on in-place conversion to pass through things
     like secured framebuffer memory without needing to bounce data
     through separate shared/private HPAs, which would introduce
     unacceptable latency for that sort of workload.

   - Hugetlb support[4] for guest_memfd will rely on it, since things like
     1GB hugepages with a mix of shared/private sub-ranges would generally
     require 2 1GB hugetlb pages to remain available to handle shared vs.
     private accesses, which quickly causes doubling of guest memory usage.

Recent kernel work[2] makes guest_memfd mmap()-able and lets the *same*
physical pages be used for both shared and private states for a given
GPA range, allowing the above pitfalls to be naturally avoided.

This series wires that support up in QEMU.

+ Peter,

Peter had the series[*] to enable the mmap() of guest memfd and allow it serve as unencrypted memory for VMs. I believe there are some overlapped efforts.

[*] https://lore.kernel.org/qemu-devel/[email protected]/


DESIGN
------

A new dedicated memory backend, memory-backend-guest-memfd, allocates
its memory via a guest_memfd file descriptor obtained from KVM with
the GUEST_MEMFD_FLAG_MMAP | GUEST_MEMFD_FLAG_INIT_SHARED flags.

A quick feedback:

The design choice from Peter's series was to extend the current hostmem-memfd backend to support guest-memfd instead of a new dedicated backend. I think we need to evaluate the pros and cons of each other, and make a choice.

(I will go read the other part later and provide more feedback)

Reply via email to