Files
qemu/docs/system/guest-memfd.rst
Peter Xu 7ca43d7ad0 hostmem: Support fully shared guest memfd to back a VM
Host backends supports guest-memfd now by detecting whether it's a
confidential VM.  There's no way to choose it yet from the memory level to
use it fully shared.  If we use guest-memfd, it so far always implies we
need two layers of memory backends, while the guest-memfd only provides the
private set of pages.

This patch introduces a way so that QEMU can consume guest memfd as the
only source of memory to back the object (aka, fully shared).

To use the fully shared guest-memfd, one can add a memfd object with:

  -object memory-backend-memfd,x-guest-memfd=on,share=on

Note that share=on is required with fully shared guest_memfd.

Since guest-memfd is not yet a drop-in replacement for memfd (e.g. lack
of hugepage support), the option is tagged as experimental for now so
that it can be made available for early enablement/testing without
causing any surprises for other users.

PS: there's a trivial touch-up on fd<0 check, because the stub to create
guest-memfd may return negative but not -1.

Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: David Hildenbrand <david@kernel.org>
Co-developed-by: Michael Roth <michael.roth@amd.com>
Signed-off-by: Michael Roth <michael.roth@amd.com>
Acked-by: Markus Armbruster <armbru@redhat.com>
Link: https://lore.kernel.org/r/20260929235109.1398509-11-michael.roth@amd.com
Signed-off-by: Peter Xu <peterx@redhat.com>
2026-09-30 08:51:04 -04:00

61 lines
2.7 KiB
ReStructuredText

.. _guest-memfd:
guest-memfd support
===================
Recent kernels allow for the creation of a guest-memfd file
descriptor, which can be used to back VMs in a similar manner as a
memfd file descriptor, but is intended specifically for this purpose
and allows for closer coordination between KVM and the management of
this memory to enable more advanced/VM-specific use-cases.
Initially this additional functionality centered around providing a
common/centralized place for managing kernel-side memory handing
requirements for various Confidential Guest architectures. (For more
on Confidential Guests, see :ref:`confidential-guest-support`).
guest_memfd has since evolved to become a more general-purpose way to
allocate/manage guest memory and potentially allow for things like
providing additional memory isolation within the kernel[1] and support
for persisting a guest's state across kexec to allow for live-updating
the host kernel with minimal guest downtime[2].
Usage
-----
For Confidential Guests, guest-memfd is currently utilized internally
by QEMU to handle private guest memory, independently of whatever
memory backend the user has configured for normal/non-private/shared
guest memory. To avoid doubling memory, QEMU discards memory in
response to the guest converting GPA ranges between shared/private.
(e.g. if GPA X is converted from private to shared, the guest-memfd FD
offset corresponding to GPA x will be truncated since the memory will
be provided by the memory backend the user configured for shared
memory, and vice-versa). This is handled automatically/internally for
Confidential Guests that rely on this handling and is not directly
exposed by QEMU command-line options.
For non-Confidential guests, guest-memfd can be used in a manner that
is somewhat interchangeable with a normal memfd. Currently, this is
handled by using the same memory-backend implementation as memfd, but
with an additional 'guest-memfd=on' option. E.g.::
qemu ... \
-object memory-backend-memfd,id=ID,size=SIZE,share=on,guest-memfd=on
Note that the share=on option is required for guest-memfd, since it
does not support anonymous memory allocations or COW-like semantics.
Also note that there are a couple of limitations in using guest_memfd
in this way compared to a normal memfd, which is why the option is
exposed as an experimental for the time being:
* guest_memfd does not currently support the hugetlb=on option
* guest_memfd does not currently support Transparent Huge Pages
References
----------
- `[1] directmap removal <https://lore.kernel.org/kvm/20260317141031.514-1-kalyazin@amazon.com/>`__
- `[2] LUO <https://lore.kernel.org/kvm/20260728121138.1103610-1-tarunsahu@google.com/>`__