From: Fabiano Rosas <farosas@suse.de>
To: Peter Xu <peterx@redhat.com>, qemu-devel@nongnu.org
Cc: Juraj Marcin <jmarcin@redhat.com>,
David Hildenbrand <david@kernel.org>,
Paolo Bonzini <pbonzini@redhat.com>,
Chenyi Qiang <chenyi.qiang@intel.com>,
peterx@redhat.com, Alexey Kardashevskiy <aik@amd.com>,
Li Xiaoyao <xiaoyao.li@intel.com>
Subject: Re: [PATCH v3 11/12] tests/migration-test: Support guest-memfd init shared mem type
Date: Tue, 16 Dec 2025 11:18:48 -0300 [thread overview]
Message-ID: <87qzsu1pdj.fsf@suse.de> (raw)
In-Reply-To: <20251215205203.1185099-12-peterx@redhat.com>
Peter Xu <peterx@redhat.com> writes:
> Support the guest-memfd type when the fd has init share enabled. It means
> the gmemfd can be used similarly to memfd.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> tests/qtest/migration/framework.h | 4 +++
> tests/qtest/migration/framework.c | 60 +++++++++++++++++++++++++++++++
> 2 files changed, 64 insertions(+)
>
> diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
> index ed85ed502d..b4c5edcad3 100644
> --- a/tests/qtest/migration/framework.h
> +++ b/tests/qtest/migration/framework.h
> @@ -34,6 +34,10 @@ typedef enum {
> * but only anonymously allocated.
> */
> MEM_TYPE_MEMFD,
> + /*
> + * Use guest-memfd, shared mappings.
> + */
> + MEM_TYPE_GUEST_MEMFD,
> MEM_TYPE_NUM,
> } MemType;
>
> diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
> index e35839c95f..9aa353bac6 100644
> --- a/tests/qtest/migration/framework.c
> +++ b/tests/qtest/migration/framework.c
> @@ -26,6 +26,10 @@
> #include "qemu/range.h"
> #include "qemu/sockets.h"
>
> +#ifdef CONFIG_LINUX
> +#include <linux/kvm.h>
> +#include <sys/ioctl.h>
> +#endif
>
> #define QEMU_VM_FILE_MAGIC 0x5145564d
> #define QEMU_ENV_SRC "QTEST_QEMU_BINARY_SRC"
> @@ -283,6 +287,9 @@ static char *migrate_mem_type_get_opts(MemType type, const char *memory_size)
> case MEM_TYPE_MEMFD:
> backend = g_strdup("-object memory-backend-memfd");
> break;
> + case MEM_TYPE_GUEST_MEMFD:
> + backend = g_strdup("-object memory-backend-memfd,guest-memfd=on");
> + break;
> default:
> g_assert_not_reached();
> break;
> @@ -425,8 +432,55 @@ int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
> return 0;
> }
>
> +static bool kvm_guest_memfd_init_shared_supported(const char **reason)
Should be in migration-util.c, like kvm_dirty_ring_supported() and
ufd_version_check().
> +{
> + assert(*reason == NULL);
> +
> +#ifdef CONFIG_LINUX
> + int ret, fd = -1;
> +
> + if (!migration_get_env()->has_kvm) {
> + *reason = "KVM is not enabled in the current QEMU build";
> + goto out;
> + }
> +
> + fd = open("/dev/kvm", O_RDWR);
> + if (fd < 0) {
> + *reason = "KVM module isn't available or missing permission";
> + goto out;
> + }
> +
> + ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_GUEST_MEMFD);
> + if (!ret) {
> + *reason = "KVM module doesn't suport guest-memfd";
> + goto out;
> + }
> +
> + ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_GUEST_MEMFD_FLAGS);
> + if (ret < 0) {
Should this be <= ? I see there's a window between the addition of
KVM_CAP_GUEST_MEMFD and KVM_CAP_GUEST_MEMFD_FLAGS in the kernel.
> + *reason = "KVM doesn't support KVM_CAP_GUEST_MEMFD_FLAGS";
> + goto out;
> + }
> +
> + if (!(ret & GUEST_MEMFD_FLAG_INIT_SHARED)) {
> + *reason = "KVM doesn't support GUEST_MEMFD_FLAG_INIT_SHARED";
> + goto out;
> + }
> +out:
> + if (fd >= 0) {
> + close(fd);
> + }
> +#else
> + *reason = "KVM not supported on non-Linux OS";
> +#endif
> +
> + return !*reason;
> +}
> +
> static bool migrate_mem_type_prepare(MemType type)
> {
> + const char *reason = NULL;
> +
> switch (type) {
> case MEM_TYPE_SHMEM:
> if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) {
> @@ -434,6 +488,12 @@ static bool migrate_mem_type_prepare(MemType type)
> return false;
> }
> break;
> + case MEM_TYPE_GUEST_MEMFD:
> + if (!kvm_guest_memfd_init_shared_supported(&reason)) {
> + g_test_skip(reason);
> + return false;
> + }
> + break;
> default:
> break;
> }
next prev parent reply other threads:[~2025-12-16 14:19 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-15 20:51 [PATCH v3 00/12] KVM/hostmem: Support init-shared guest-memfd as VM backends Peter Xu
2025-12-15 20:51 ` [PATCH v3 01/12] kvm: Decouple memory attribute check from kvm_guest_memfd_supported Peter Xu
2025-12-16 12:41 ` Xiaoyao Li
2025-12-23 16:56 ` Peter Xu
2025-12-16 13:53 ` Fabiano Rosas
2025-12-23 17:02 ` Peter Xu
2026-06-02 1:10 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 02/12] kvm: Detect guest-memfd flags supported Peter Xu
2025-12-16 13:54 ` Fabiano Rosas
2026-06-02 1:29 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 03/12] kvm: Provide explicit error for kvm_create_guest_memfd() Peter Xu
2025-12-16 4:03 ` Xiaoyao Li
2025-12-16 13:55 ` Fabiano Rosas
2026-06-02 1:31 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 04/12] ramblock: Rename guest_memfd to guest_memfd_private Peter Xu
2026-06-02 1:37 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 05/12] memory: Rename RAM_GUEST_MEMFD to RAM_GUEST_MEMFD_PRIVATE Peter Xu
2025-12-16 5:49 ` Xiaoyao Li
2025-12-23 17:04 ` Peter Xu
2026-06-02 1:39 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 06/12] memory: Rename memory_region_has_guest_memfd() to *_private() Peter Xu
2026-06-02 1:40 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 07/12] hostmem: Rename guest_memfd to guest_memfd_private Peter Xu
2025-12-16 5:54 ` Xiaoyao Li
2026-06-02 18:56 ` Michael Roth
2025-12-15 20:51 ` [PATCH v3 08/12] hostmem: Support fully shared guest memfd to back a VM Peter Xu
2025-12-16 6:54 ` Xiaoyao Li
2025-12-16 14:02 ` Fabiano Rosas
2026-06-02 21:40 ` Michael Roth
2026-06-05 7:23 ` David Hildenbrand (Arm)
2026-06-05 11:23 ` David Hildenbrand (Arm)
2025-12-15 20:52 ` [PATCH v3 09/12] machine: Rename machine_require_guest_memfd() to *_private() Peter Xu
2025-12-16 6:55 ` Xiaoyao Li
2026-06-02 21:46 ` Michael Roth
2025-12-15 20:52 ` [PATCH v3 10/12] memory: Rename memory_region_init_ram_guest_memfd() " Peter Xu
2025-12-16 6:56 ` Xiaoyao Li
2026-06-02 21:49 ` Michael Roth
2025-12-15 20:52 ` [PATCH v3 11/12] tests/migration-test: Support guest-memfd init shared mem type Peter Xu
2025-12-16 14:18 ` Fabiano Rosas [this message]
2025-12-23 17:09 ` Peter Xu
2025-12-15 20:52 ` [PATCH v3 12/12] tests/migration-test: Add a precopy test for guest-memfd Peter Xu
2025-12-16 14:20 ` Fabiano Rosas
2026-06-02 22:02 ` [PATCH v3 00/12] KVM/hostmem: Support init-shared guest-memfd as VM backends Michael Roth
2026-06-03 19:27 ` Peter Xu
2026-06-04 22:36 ` Michael Roth
2026-06-05 14:57 ` Peter Xu
2026-06-08 17:59 ` Michael Roth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87qzsu1pdj.fsf@suse.de \
--to=farosas@suse.de \
--cc=aik@amd.com \
--cc=chenyi.qiang@intel.com \
--cc=david@kernel.org \
--cc=jmarcin@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=xiaoyao.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.