[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <4310b9291b9662c1059ebcf50e267760bc8e1c6f.1747368093.git.afranji@google.com>
Date: Fri, 16 May 2025 19:19:33 +0000
From: Ryan Afranji <afranji@...gle.com>
To: afranji@...gle.com, ackerleytng@...gle.com, pbonzini@...hat.com,
seanjc@...gle.com, tglx@...utronix.de, x86@...nel.org, kvm@...r.kernel.org,
linux-kernel@...r.kernel.org, linux-kselftest@...r.kernel.org,
tabba@...gle.com
Cc: mingo@...hat.com, bp@...en8.de, dave.hansen@...ux.intel.com, hpa@...or.com,
shuah@...nel.org, andrew.jones@...ux.dev, ricarkol@...gle.com,
chao.p.peng@...ux.intel.com, jarkko@...nel.org, yu.c.zhang@...ux.intel.com,
vannapurve@...gle.com, erdemaktas@...gle.com, mail@...iej.szmigiero.name,
vbabka@...e.cz, david@...hat.com, qperret@...gle.com, michael.roth@....com,
wei.w.wang@...el.com, liam.merwick@...cle.com, isaku.yamahata@...il.com,
kirill.shutemov@...ux.intel.com, sagis@...gle.com, jthoughton@...gle.com
Subject: [RFC PATCH v2 13/13] KVM: selftests: Add tests for migration of
private mem
From: Ackerley Tng <ackerleytng@...gle.com>
Tests that private mem (in guest_mem files) can be migrated. Also
demonstrates the migration flow.
Signed-off-by: Ackerley Tng <ackerleytng@...gle.com>
Signed-off-by: Ryan Afranji <afranji@...gle.com>
---
tools/testing/selftests/kvm/Makefile.kvm | 1 +
.../kvm/x86/private_mem_migrate_tests.c | 56 ++++++++++---------
2 files changed, 32 insertions(+), 25 deletions(-)
diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm
index f62b0a5aba35..e9d53ea6c6c8 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -85,6 +85,7 @@ TEST_GEN_PROGS_x86 += x86/platform_info_test
TEST_GEN_PROGS_x86 += x86/pmu_counters_test
TEST_GEN_PROGS_x86 += x86/pmu_event_filter_test
TEST_GEN_PROGS_x86 += x86/private_mem_conversions_test
+TEST_GEN_PROGS_x86 += x86/private_mem_migrate_tests
TEST_GEN_PROGS_x86 += x86/private_mem_kvm_exits_test
TEST_GEN_PROGS_x86 += x86/set_boot_cpu_id
TEST_GEN_PROGS_x86 += x86/set_sregs_test
diff --git a/tools/testing/selftests/kvm/x86/private_mem_migrate_tests.c b/tools/testing/selftests/kvm/x86/private_mem_migrate_tests.c
index 4226de3ebd41..4ad94ea04b66 100644
--- a/tools/testing/selftests/kvm/x86/private_mem_migrate_tests.c
+++ b/tools/testing/selftests/kvm/x86/private_mem_migrate_tests.c
@@ -1,32 +1,32 @@
// SPDX-License-Identifier: GPL-2.0
-#include "kvm_util_base.h"
+#include "kvm_util.h"
#include "test_util.h"
#include "ucall_common.h"
#include <linux/kvm.h>
#include <linux/sizes.h>
-#define TRANSFER_PRIVATE_MEM_TEST_SLOT 10
-#define TRANSFER_PRIVATE_MEM_GPA ((uint64_t)(1ull << 32))
-#define TRANSFER_PRIVATE_MEM_GVA TRANSFER_PRIVATE_MEM_GPA
-#define TRANSFER_PRIVATE_MEM_VALUE 0xdeadbeef
+#define MIGRATE_PRIVATE_MEM_TEST_SLOT 10
+#define MIGRATE_PRIVATE_MEM_GPA ((uint64_t)(1ull << 32))
+#define MIGRATE_PRIVATE_MEM_GVA MIGRATE_PRIVATE_MEM_GPA
+#define MIGRATE_PRIVATE_MEM_VALUE 0xdeadbeef
-static void transfer_private_mem_guest_code_src(void)
+static void migrate_private_mem_data_guest_code_src(void)
{
- uint64_t volatile *const ptr = (uint64_t *)TRANSFER_PRIVATE_MEM_GVA;
+ uint64_t volatile *const ptr = (uint64_t *)MIGRATE_PRIVATE_MEM_GVA;
- *ptr = TRANSFER_PRIVATE_MEM_VALUE;
+ *ptr = MIGRATE_PRIVATE_MEM_VALUE;
GUEST_SYNC1(*ptr);
}
-static void transfer_private_mem_guest_code_dst(void)
+static void migrate_private_mem_guest_code_dst(void)
{
- uint64_t volatile *const ptr = (uint64_t *)TRANSFER_PRIVATE_MEM_GVA;
+ uint64_t volatile *const ptr = (uint64_t *)MIGRATE_PRIVATE_MEM_GVA;
GUEST_SYNC1(*ptr);
}
-static void test_transfer_private_mem(void)
+static void test_migrate_private_mem_data(bool migrate)
{
struct kvm_vm *src_vm, *dst_vm;
struct kvm_vcpu *src_vcpu, *dst_vcpu;
@@ -40,40 +40,43 @@ static void test_transfer_private_mem(void)
/* Build the source VM, use it to write to private memory */
src_vm = __vm_create_shape_with_one_vcpu(
- shape, &src_vcpu, 0, transfer_private_mem_guest_code_src);
+ shape, &src_vcpu, 0, migrate_private_mem_data_guest_code_src);
src_memfd = vm_create_guest_memfd(src_vm, SZ_4K, 0);
- vm_mem_add(src_vm, DEFAULT_VM_MEM_SRC, TRANSFER_PRIVATE_MEM_GPA,
- TRANSFER_PRIVATE_MEM_TEST_SLOT, 1, KVM_MEM_PRIVATE,
+ vm_mem_add(src_vm, DEFAULT_VM_MEM_SRC, MIGRATE_PRIVATE_MEM_GPA,
+ MIGRATE_PRIVATE_MEM_TEST_SLOT, 1, KVM_MEM_GUEST_MEMFD,
src_memfd, 0);
- virt_map(src_vm, TRANSFER_PRIVATE_MEM_GVA, TRANSFER_PRIVATE_MEM_GPA, 1);
- vm_set_memory_attributes(src_vm, TRANSFER_PRIVATE_MEM_GPA, SZ_4K,
+ virt_map(src_vm, MIGRATE_PRIVATE_MEM_GVA, MIGRATE_PRIVATE_MEM_GPA, 1);
+ vm_set_memory_attributes(src_vm, MIGRATE_PRIVATE_MEM_GPA, SZ_4K,
KVM_MEMORY_ATTRIBUTE_PRIVATE);
vcpu_run(src_vcpu);
TEST_ASSERT_KVM_EXIT_REASON(src_vcpu, KVM_EXIT_IO);
get_ucall(src_vcpu, &uc);
- TEST_ASSERT(uc.args[0] == TRANSFER_PRIVATE_MEM_VALUE,
+ TEST_ASSERT(uc.args[0] == MIGRATE_PRIVATE_MEM_VALUE,
"Source VM should be able to write to private memory");
/* Build the destination VM with linked fd */
dst_vm = __vm_create_shape_with_one_vcpu(
- shape, &dst_vcpu, 0, transfer_private_mem_guest_code_dst);
+ shape, &dst_vcpu, 0, migrate_private_mem_guest_code_dst);
dst_memfd = vm_link_guest_memfd(dst_vm, src_memfd, 0);
- vm_mem_add(dst_vm, DEFAULT_VM_MEM_SRC, TRANSFER_PRIVATE_MEM_GPA,
- TRANSFER_PRIVATE_MEM_TEST_SLOT, 1, KVM_MEM_PRIVATE,
+ vm_mem_add(dst_vm, DEFAULT_VM_MEM_SRC, MIGRATE_PRIVATE_MEM_GPA,
+ MIGRATE_PRIVATE_MEM_TEST_SLOT, 1, KVM_MEM_GUEST_MEMFD,
dst_memfd, 0);
- virt_map(dst_vm, TRANSFER_PRIVATE_MEM_GVA, TRANSFER_PRIVATE_MEM_GPA, 1);
- vm_set_memory_attributes(dst_vm, TRANSFER_PRIVATE_MEM_GPA, SZ_4K,
- KVM_MEMORY_ATTRIBUTE_PRIVATE);
+ virt_map(dst_vm, MIGRATE_PRIVATE_MEM_GVA, MIGRATE_PRIVATE_MEM_GPA, 1);
+ if (migrate)
+ vm_migrate_from(dst_vm, src_vm);
+ else
+ vm_set_memory_attributes(dst_vm, MIGRATE_PRIVATE_MEM_GPA, SZ_4K,
+ KVM_MEMORY_ATTRIBUTE_PRIVATE);
vcpu_run(dst_vcpu);
TEST_ASSERT_KVM_EXIT_REASON(dst_vcpu, KVM_EXIT_IO);
get_ucall(dst_vcpu, &uc);
- TEST_ASSERT(uc.args[0] == TRANSFER_PRIVATE_MEM_VALUE,
+ TEST_ASSERT(uc.args[0] == MIGRATE_PRIVATE_MEM_VALUE,
"Destination VM should be able to read value transferred");
}
@@ -81,7 +84,10 @@ int main(int argc, char *argv[])
{
TEST_REQUIRE(kvm_check_cap(KVM_CAP_VM_TYPES) & BIT(KVM_X86_SW_PROTECTED_VM));
- test_transfer_private_mem();
+ test_migrate_private_mem_data(false);
+
+ if (kvm_check_cap(KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM))
+ test_migrate_private_mem_data(true);
return 0;
}
--
2.49.0.1101.gccaa498523-goog
Powered by blists - more mailing lists