Current hostmem code (which is callable even outside of KVM) specifies guest_memfd flags directly, which requires pulling in kernel headers. Additionally, it will eventually require additional knowledge that is more suitable for KVM-aware code (e.g. whether or not to default to private memory for confidential VMs).
Instead, push the determination for what flags are needed down into the KVM/guest_memfd code so they can be handled internally based on VM type/configuration and avoid further potential leakage of KVM-specific code to general code. Signed-off-by: Michael Roth <[email protected]> --- accel/kvm/kvm-all.c | 26 ++++++++++++++++++++++++-- accel/stubs/kvm-stub.c | 2 +- backends/hostmem-memfd.c | 6 +----- include/system/kvm.h | 2 +- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 2b838eb690..bf81a19423 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -4857,7 +4857,8 @@ void kvm_mark_guest_state_protected(void) kvm_state->guest_state_protected = true; } -int kvm_create_guest_memfd(uint64_t size, uint64_t flags, Error **errp) +static int kvm_create_guest_memfd_flags(uint64_t size, uint64_t flags, + Error **errp) { int fd; struct kvm_create_guest_memfd guest_memfd = { @@ -4898,6 +4899,27 @@ int kvm_create_guest_memfd(uint64_t size, uint64_t flags, Error **errp) return fd; } +int kvm_create_guest_memfd(uint64_t size, Error **errp) +{ + /* + * There isn't currently any use for non-mmap()'able gmem instances + * outside of kvm_create_guest_memfd_private(), so hardcode it here + * for general use. + * + * Additionally, *_INIT_SHARED is needed for non-confidential VMs, and + * confidential VMs will default to this as well to allow similar flows + * for initializing the VM's initial memory contents as with normal + * guests. In the future, the initial state may become a global policy + * decision based on the confidential VM configuration, in which case + * this would likely be the right place to decide whether or not to set + * the flag since it would likely be a globally-configured option. + */ + return kvm_create_guest_memfd_flags(size, + GUEST_MEMFD_FLAG_MMAP | + GUEST_MEMFD_FLAG_INIT_SHARED, + errp); +} + int kvm_create_guest_memfd_private(uint64_t size, Error **errp) { if (!(kvm_supported_memory_attributes & KVM_MEMORY_ATTRIBUTE_PRIVATE)) { @@ -4905,5 +4927,5 @@ int kvm_create_guest_memfd_private(uint64_t size, Error **errp) return -1; } - return kvm_create_guest_memfd(size, 0, errp); + return kvm_create_guest_memfd_flags(size, 0, errp); } diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index 9fe58efe91..26003b01a3 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -139,7 +139,7 @@ bool kvm_hwpoisoned_mem(void) return false; } -int kvm_create_guest_memfd(uint64_t size, uint64_t flags, Error **errp) +int kvm_create_guest_memfd(uint64_t size, Error **errp) { error_setg(errp, "KVM is not enabled"); return -ENOSYS; diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c index a9759e682b..de51cf738a 100644 --- a/backends/hostmem-memfd.c +++ b/backends/hostmem-memfd.c @@ -19,7 +19,6 @@ #include "qom/object.h" #include "migration/cpr.h" #include "system/kvm.h" -#include <linux/kvm.h> OBJECT_DECLARE_SIMPLE_TYPE(HostMemoryBackendMemfd, MEMORY_BACKEND_MEMFD) @@ -69,10 +68,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) return false; } - fd = kvm_create_guest_memfd(backend->size, - GUEST_MEMFD_FLAG_MMAP | - GUEST_MEMFD_FLAG_INIT_SHARED, - errp); + fd = kvm_create_guest_memfd(backend->size, errp); } else { fd = qemu_memfd_create(TYPE_MEMORY_BACKEND_MEMFD, backend->size, m->hugetlb, m->hugetlbsize, m->seal ? diff --git a/include/system/kvm.h b/include/system/kvm.h index b1e43ddc93..2a1501bba6 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -547,7 +547,7 @@ void kvm_mark_guest_state_protected(void); */ bool kvm_hwpoisoned_mem(void); -int kvm_create_guest_memfd(uint64_t size, uint64_t flags, Error **errp); +int kvm_create_guest_memfd(uint64_t size, Error **errp); int kvm_create_guest_memfd_private(uint64_t size, Error **errp); int kvm_set_memory_attributes_private(hwaddr start, uint64_t size); -- 2.43.0
