mirror of
https://gitlab.com/qemu-project/qemu.git
synced 2026-10-28 14:04:39 +08:00
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>
61 lines
2.7 KiB
ReStructuredText
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/>`__
|