From: Sean Christopherson <seanjc@google.com>
To: Marc Zyngier <maz@kernel.org>, Oliver Upton <oupton@kernel.org>,
Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Tianrui Zhao <zhaotianrui@loongson.cn>,
Bibo Mao <maobibo@loongson.cn>,
Huacai Chen <chenhuacai@kernel.org>,
Anup Patel <anup@brainfault.org>, Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Fuad Tabba <fuad.tabba@linux.dev>,
Joey Gouly <joey.gouly@arm.com>,
Steffen Eiden <seiden@linux.ibm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Atish Patra <atish.patra@linux.dev>,
Alexandre Ghiti <alex@ghiti.fr>,
David Hildenbrand <david@kernel.org>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, loongarch@lists.linux.dev,
kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
linux-kernel@vger.kernel.org,
Nicholas Piggin <npiggin@gmail.com>,
Ritesh Harjani <ritesh.list@gmail.com>
Subject: [PATCH 19/20] KVM: selftests: Automatically pick min_gpa for allocations based on region type
Date: Wed, 26 Aug 2026 16:05:10 -0700 [thread overview]
Message-ID: <20260826230511.972824-20-seanjc@google.com> (raw)
In-Reply-To: <20260826230511.972824-1-seanjc@google.com>
Automatically choose the minimum GPA for physical page allocations based on
the region type instead of sprinkling the logic over various wrappers and
tests. All usage falls into three categories: (a) don't care, just use the
bare minimum GPA, (b) page tables, use a slightly higher min to keep low
memory available, (c) custom memslot, use the base of the memslot. I.e.
there isn't a strong need to allow completely custom minimums.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../selftests/kvm/arm64/vgic_lpi_stress.c | 11 ++----
.../testing/selftests/kvm/include/kvm_util.h | 12 +++---
tools/testing/selftests/kvm/lib/kvm_util.c | 38 ++++++++++++++++---
.../testing/selftests/kvm/lib/x86/processor.c | 3 +-
.../selftests/kvm/set_memory_region_test.c | 2 +-
.../x86/smaller_maxphyaddr_emulation_test.c | 2 +-
6 files changed, 44 insertions(+), 24 deletions(-)
diff --git a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
index a45c0849a47a..b4c651ea385d 100644
--- a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
+++ b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
@@ -191,28 +191,25 @@ static void setup_test_data(void)
gpa_t cmdq_base;
test_data.device_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
test_data.collection_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
- cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, gpa_base,
- MEM_REGION_TEST_EXTRA);
+ cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, MEM_REGION_TEST_EXTRA);
virt_map(vm, cmdq_base, cmdq_base, pages_per_64k);
test_data.cmdq_base = cmdq_base;
test_data.cmdq_base_va = (void *)cmdq_base;
test_data.itt_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_devices,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
test_data.lpi_prop_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
configure_lpis();
test_data.lpi_pend_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_cpus,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
sync_global_to_guest(vm, test_data);
}
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index a0cd1b6598d4..1264cd1a343a 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -1052,11 +1052,10 @@ const char *exit_reason_str(unsigned int exit_reason);
gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
u32 memslot, bool protected, bool naturally_aligned);
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected);
static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
- gpa_t min_gpa,
enum kvm_mem_region_type type)
{
/*
@@ -1064,20 +1063,19 @@ static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
* protected memory, as the majority of memory for such VMs is
* protected, i.e. using shared memory is effectively opt-in.
*/
- return __vm_phy_pages_alloc(vm, nr_pages, min_gpa, type,
+ return __vm_phy_pages_alloc(vm, nr_pages, type,
vm_arch_has_protected_memory(vm));
}
-static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm, gpa_t min_gpa,
+static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm,
enum kvm_mem_region_type type)
{
- return vm_phy_pages_alloc(vm, 1, min_gpa, type);
+ return vm_phy_pages_alloc(vm, 1, type);
}
static inline gpa_t vm_alloc_page_table_pages(struct kvm_vm *vm, size_t nr_pages)
{
- return vm_phy_pages_alloc(vm, nr_pages, KVM_GUEST_PAGE_TABLE_MIN_PADDR,
- MEM_REGION_PT);
+ return vm_phy_pages_alloc(vm, nr_pages, MEM_REGION_PT);
}
static inline gpa_t vm_alloc_page_table(struct kvm_vm *vm)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e500d1799151..8b5b330a5889 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1473,9 +1473,7 @@ static gva_t ____vm_alloc(struct kvm_vm *vm, size_t sz, gva_t min_gva,
u64 pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
virt_pgd_alloc(vm);
- gpa_t gpa = __vm_phy_pages_alloc(vm, pages,
- KVM_UTIL_MIN_PFN * vm->page_size,
- type, protected);
+ gpa_t gpa = __vm_phy_pages_alloc(vm, pages, type, protected);
/*
* Find an unused range of virtual page addresses of at least
@@ -2087,11 +2085,39 @@ gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
__builtin_unreachable();
}
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected)
{
- TEST_ASSERT(type < NR_MEM_REGIONS,
- "Invalid memory region type '%u'", type);
+ struct userspace_mem_region *region = vm_get_mem_region(vm, type);
+ gpa_t min_gpa;
+
+ TEST_ASSERT(region, "No region for type '%u', memslot '%u'",
+ type, vm->memslots[type]);
+
+ switch (type) {
+ case MEM_REGION_CODE:
+ case MEM_REGION_DATA:
+ case MEM_REGION_TEST_DATA:
+ /*
+ * If the region is backed by the default memslot (id=0), use
+ * selftests' hardcoded minimum PFN, otherwise use the base of
+ * the custom memory slot that backs the region.
+ */
+ if (!vm->memslots[type])
+ min_gpa = KVM_UTIL_MIN_PFN * vm->page_size;
+ else
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ case MEM_REGION_PT:
+ min_gpa = KVM_GUEST_PAGE_TABLE_MIN_PADDR;
+ break;
+ case MEM_REGION_TEST_EXTRA:
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ default:
+ TEST_FAIL("Invalid memory region type '%u'", type);
+ break;
+ }
return ____vm_phy_pages_alloc(vm, nr_pages, min_gpa, vm->memslots[type],
protected, false);
diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c
index 39d9ca6ceb1d..479e9a481687 100644
--- a/tools/testing/selftests/kvm/lib/x86/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86/processor.c
@@ -1474,8 +1474,7 @@ void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, gpa_t smram_gpa,
vm_override_mem_region(vm, MEM_REGION_TEST_EXTRA, VM_MEM_SRC_ANONYMOUS,
smram_gpa, SMRAM_MEMSLOT, SMRAM_PAGES);
- TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, smram_gpa,
- MEM_REGION_TEST_EXTRA) == smram_gpa,
+ TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, MEM_REGION_TEST_EXTRA) == smram_gpa,
"Could not allocate guest physical addresses for SMRAM");
memset(addr_gpa2hva(vm, smram_gpa), 0x0, SMRAM_SIZE);
diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 160bbe3d7203..bfa5ac8ce029 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -124,7 +124,7 @@ static struct kvm_vm *spawn_vm(struct kvm_vcpu **vcpu, pthread_t *vcpu_thread,
* Allocate and map two pages so that the GPA accessed by guest_code()
* stays valid across the memslot move.
*/
- gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc\n");
virt_map(vm, MEM_REGION_GPA, MEM_REGION_GPA, 2);
diff --git a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
index 4e125eb5e0cf..8d1822717abd 100644
--- a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
+++ b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
MEM_REGION_SIZE / PAGE_SIZE);
gpa = vm_phy_pages_alloc(vm, MEM_REGION_SIZE / PAGE_SIZE,
- MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc");
virt_map(vm, MEM_REGION_GVA, MEM_REGION_GPA, 1);
hva = addr_gpa2hva(vm, MEM_REGION_GPA);
--
2.55.0.887.g758fc8c411-goog
WARNING: multiple messages have this Message-ID (diff)
From: Sean Christopherson <seanjc@google.com>
To: Marc Zyngier <maz@kernel.org>, Oliver Upton <oupton@kernel.org>,
Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Tianrui Zhao <zhaotianrui@loongson.cn>,
Bibo Mao <maobibo@loongson.cn>,
Huacai Chen <chenhuacai@kernel.org>,
Anup Patel <anup@brainfault.org>, Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Fuad Tabba <fuad.tabba@linux.dev>,
Joey Gouly <joey.gouly@arm.com>,
Steffen Eiden <seiden@linux.ibm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Atish Patra <atish.patra@linux.dev>,
Alexandre Ghiti <alex@ghiti.fr>,
David Hildenbrand <david@kernel.org>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, loongarch@lists.linux.dev,
kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
linux-kernel@vger.kernel.org,
Nicholas Piggin <npiggin@gmail.com>,
Ritesh Harjani <ritesh.list@gmail.com>
Subject: [PATCH 19/20] KVM: selftests: Automatically pick min_gpa for allocations based on region type
Date: Wed, 26 Aug 2026 16:05:10 -0700 [thread overview]
Message-ID: <20260826230511.972824-20-seanjc@google.com> (raw)
In-Reply-To: <20260826230511.972824-1-seanjc@google.com>
Automatically choose the minimum GPA for physical page allocations based on
the region type instead of sprinkling the logic over various wrappers and
tests. All usage falls into three categories: (a) don't care, just use the
bare minimum GPA, (b) page tables, use a slightly higher min to keep low
memory available, (c) custom memslot, use the base of the memslot. I.e.
there isn't a strong need to allow completely custom minimums.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../selftests/kvm/arm64/vgic_lpi_stress.c | 11 ++----
.../testing/selftests/kvm/include/kvm_util.h | 12 +++---
tools/testing/selftests/kvm/lib/kvm_util.c | 38 ++++++++++++++++---
.../testing/selftests/kvm/lib/x86/processor.c | 3 +-
.../selftests/kvm/set_memory_region_test.c | 2 +-
.../x86/smaller_maxphyaddr_emulation_test.c | 2 +-
6 files changed, 44 insertions(+), 24 deletions(-)
diff --git a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
index a45c0849a47a..b4c651ea385d 100644
--- a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
+++ b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
@@ -191,28 +191,25 @@ static void setup_test_data(void)
gpa_t cmdq_base;
test_data.device_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
test_data.collection_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
- cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, gpa_base,
- MEM_REGION_TEST_EXTRA);
+ cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, MEM_REGION_TEST_EXTRA);
virt_map(vm, cmdq_base, cmdq_base, pages_per_64k);
test_data.cmdq_base = cmdq_base;
test_data.cmdq_base_va = (void *)cmdq_base;
test_data.itt_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_devices,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
test_data.lpi_prop_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
configure_lpis();
test_data.lpi_pend_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_cpus,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
sync_global_to_guest(vm, test_data);
}
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index a0cd1b6598d4..1264cd1a343a 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -1052,11 +1052,10 @@ const char *exit_reason_str(unsigned int exit_reason);
gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
u32 memslot, bool protected, bool naturally_aligned);
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected);
static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
- gpa_t min_gpa,
enum kvm_mem_region_type type)
{
/*
@@ -1064,20 +1063,19 @@ static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
* protected memory, as the majority of memory for such VMs is
* protected, i.e. using shared memory is effectively opt-in.
*/
- return __vm_phy_pages_alloc(vm, nr_pages, min_gpa, type,
+ return __vm_phy_pages_alloc(vm, nr_pages, type,
vm_arch_has_protected_memory(vm));
}
-static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm, gpa_t min_gpa,
+static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm,
enum kvm_mem_region_type type)
{
- return vm_phy_pages_alloc(vm, 1, min_gpa, type);
+ return vm_phy_pages_alloc(vm, 1, type);
}
static inline gpa_t vm_alloc_page_table_pages(struct kvm_vm *vm, size_t nr_pages)
{
- return vm_phy_pages_alloc(vm, nr_pages, KVM_GUEST_PAGE_TABLE_MIN_PADDR,
- MEM_REGION_PT);
+ return vm_phy_pages_alloc(vm, nr_pages, MEM_REGION_PT);
}
static inline gpa_t vm_alloc_page_table(struct kvm_vm *vm)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e500d1799151..8b5b330a5889 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1473,9 +1473,7 @@ static gva_t ____vm_alloc(struct kvm_vm *vm, size_t sz, gva_t min_gva,
u64 pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
virt_pgd_alloc(vm);
- gpa_t gpa = __vm_phy_pages_alloc(vm, pages,
- KVM_UTIL_MIN_PFN * vm->page_size,
- type, protected);
+ gpa_t gpa = __vm_phy_pages_alloc(vm, pages, type, protected);
/*
* Find an unused range of virtual page addresses of at least
@@ -2087,11 +2085,39 @@ gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
__builtin_unreachable();
}
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected)
{
- TEST_ASSERT(type < NR_MEM_REGIONS,
- "Invalid memory region type '%u'", type);
+ struct userspace_mem_region *region = vm_get_mem_region(vm, type);
+ gpa_t min_gpa;
+
+ TEST_ASSERT(region, "No region for type '%u', memslot '%u'",
+ type, vm->memslots[type]);
+
+ switch (type) {
+ case MEM_REGION_CODE:
+ case MEM_REGION_DATA:
+ case MEM_REGION_TEST_DATA:
+ /*
+ * If the region is backed by the default memslot (id=0), use
+ * selftests' hardcoded minimum PFN, otherwise use the base of
+ * the custom memory slot that backs the region.
+ */
+ if (!vm->memslots[type])
+ min_gpa = KVM_UTIL_MIN_PFN * vm->page_size;
+ else
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ case MEM_REGION_PT:
+ min_gpa = KVM_GUEST_PAGE_TABLE_MIN_PADDR;
+ break;
+ case MEM_REGION_TEST_EXTRA:
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ default:
+ TEST_FAIL("Invalid memory region type '%u'", type);
+ break;
+ }
return ____vm_phy_pages_alloc(vm, nr_pages, min_gpa, vm->memslots[type],
protected, false);
diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c
index 39d9ca6ceb1d..479e9a481687 100644
--- a/tools/testing/selftests/kvm/lib/x86/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86/processor.c
@@ -1474,8 +1474,7 @@ void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, gpa_t smram_gpa,
vm_override_mem_region(vm, MEM_REGION_TEST_EXTRA, VM_MEM_SRC_ANONYMOUS,
smram_gpa, SMRAM_MEMSLOT, SMRAM_PAGES);
- TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, smram_gpa,
- MEM_REGION_TEST_EXTRA) == smram_gpa,
+ TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, MEM_REGION_TEST_EXTRA) == smram_gpa,
"Could not allocate guest physical addresses for SMRAM");
memset(addr_gpa2hva(vm, smram_gpa), 0x0, SMRAM_SIZE);
diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 160bbe3d7203..bfa5ac8ce029 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -124,7 +124,7 @@ static struct kvm_vm *spawn_vm(struct kvm_vcpu **vcpu, pthread_t *vcpu_thread,
* Allocate and map two pages so that the GPA accessed by guest_code()
* stays valid across the memslot move.
*/
- gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc\n");
virt_map(vm, MEM_REGION_GPA, MEM_REGION_GPA, 2);
diff --git a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
index 4e125eb5e0cf..8d1822717abd 100644
--- a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
+++ b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
MEM_REGION_SIZE / PAGE_SIZE);
gpa = vm_phy_pages_alloc(vm, MEM_REGION_SIZE / PAGE_SIZE,
- MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc");
virt_map(vm, MEM_REGION_GVA, MEM_REGION_GPA, 1);
hva = addr_gpa2hva(vm, MEM_REGION_GPA);
--
2.55.0.887.g758fc8c411-goog
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Sean Christopherson <seanjc@google.com>
To: Marc Zyngier <maz@kernel.org>, Oliver Upton <oupton@kernel.org>,
Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Tianrui Zhao <zhaotianrui@loongson.cn>,
Bibo Mao <maobibo@loongson.cn>,
Huacai Chen <chenhuacai@kernel.org>,
Anup Patel <anup@brainfault.org>, Paul Walmsley <pjw@kernel.org>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Janosch Frank <frankja@linux.ibm.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: Fuad Tabba <fuad.tabba@linux.dev>,
Joey Gouly <joey.gouly@arm.com>,
Steffen Eiden <seiden@linux.ibm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Atish Patra <atish.patra@linux.dev>,
Alexandre Ghiti <alex@ghiti.fr>,
David Hildenbrand <david@kernel.org>,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, loongarch@lists.linux.dev,
kvm-riscv@lists.infradead.org, linux-riscv@lists.infradead.org,
linux-kernel@vger.kernel.org,
Nicholas Piggin <npiggin@gmail.com>,
Ritesh Harjani <ritesh.list@gmail.com>
Subject: [PATCH 19/20] KVM: selftests: Automatically pick min_gpa for allocations based on region type
Date: Wed, 26 Aug 2026 16:05:10 -0700 [thread overview]
Message-ID: <20260826230511.972824-20-seanjc@google.com> (raw)
In-Reply-To: <20260826230511.972824-1-seanjc@google.com>
Automatically choose the minimum GPA for physical page allocations based on
the region type instead of sprinkling the logic over various wrappers and
tests. All usage falls into three categories: (a) don't care, just use the
bare minimum GPA, (b) page tables, use a slightly higher min to keep low
memory available, (c) custom memslot, use the base of the memslot. I.e.
there isn't a strong need to allow completely custom minimums.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
.../selftests/kvm/arm64/vgic_lpi_stress.c | 11 ++----
.../testing/selftests/kvm/include/kvm_util.h | 12 +++---
tools/testing/selftests/kvm/lib/kvm_util.c | 38 ++++++++++++++++---
.../testing/selftests/kvm/lib/x86/processor.c | 3 +-
.../selftests/kvm/set_memory_region_test.c | 2 +-
.../x86/smaller_maxphyaddr_emulation_test.c | 2 +-
6 files changed, 44 insertions(+), 24 deletions(-)
diff --git a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
index a45c0849a47a..b4c651ea385d 100644
--- a/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
+++ b/tools/testing/selftests/kvm/arm64/vgic_lpi_stress.c
@@ -191,28 +191,25 @@ static void setup_test_data(void)
gpa_t cmdq_base;
test_data.device_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
test_data.collection_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base,
MEM_REGION_TEST_EXTRA);
- cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, gpa_base,
- MEM_REGION_TEST_EXTRA);
+ cmdq_base = vm_phy_pages_alloc(vm, pages_per_64k, MEM_REGION_TEST_EXTRA);
virt_map(vm, cmdq_base, cmdq_base, pages_per_64k);
test_data.cmdq_base = cmdq_base;
test_data.cmdq_base_va = (void *)cmdq_base;
test_data.itt_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_devices,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
test_data.lpi_prop_table = vm_phy_pages_alloc(vm, pages_per_64k,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
configure_lpis();
test_data.lpi_pend_tables = vm_phy_pages_alloc(vm, pages_per_64k * nr_cpus,
- gpa_base, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
sync_global_to_guest(vm, test_data);
}
diff --git a/tools/testing/selftests/kvm/include/kvm_util.h b/tools/testing/selftests/kvm/include/kvm_util.h
index a0cd1b6598d4..1264cd1a343a 100644
--- a/tools/testing/selftests/kvm/include/kvm_util.h
+++ b/tools/testing/selftests/kvm/include/kvm_util.h
@@ -1052,11 +1052,10 @@ const char *exit_reason_str(unsigned int exit_reason);
gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
u32 memslot, bool protected, bool naturally_aligned);
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected);
static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
- gpa_t min_gpa,
enum kvm_mem_region_type type)
{
/*
@@ -1064,20 +1063,19 @@ static inline gpa_t vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
* protected memory, as the majority of memory for such VMs is
* protected, i.e. using shared memory is effectively opt-in.
*/
- return __vm_phy_pages_alloc(vm, nr_pages, min_gpa, type,
+ return __vm_phy_pages_alloc(vm, nr_pages, type,
vm_arch_has_protected_memory(vm));
}
-static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm, gpa_t min_gpa,
+static inline gpa_t vm_phy_page_alloc(struct kvm_vm *vm,
enum kvm_mem_region_type type)
{
- return vm_phy_pages_alloc(vm, 1, min_gpa, type);
+ return vm_phy_pages_alloc(vm, 1, type);
}
static inline gpa_t vm_alloc_page_table_pages(struct kvm_vm *vm, size_t nr_pages)
{
- return vm_phy_pages_alloc(vm, nr_pages, KVM_GUEST_PAGE_TABLE_MIN_PADDR,
- MEM_REGION_PT);
+ return vm_phy_pages_alloc(vm, nr_pages, MEM_REGION_PT);
}
static inline gpa_t vm_alloc_page_table(struct kvm_vm *vm)
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e500d1799151..8b5b330a5889 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -1473,9 +1473,7 @@ static gva_t ____vm_alloc(struct kvm_vm *vm, size_t sz, gva_t min_gva,
u64 pages = (sz >> vm->page_shift) + ((sz % vm->page_size) != 0);
virt_pgd_alloc(vm);
- gpa_t gpa = __vm_phy_pages_alloc(vm, pages,
- KVM_UTIL_MIN_PFN * vm->page_size,
- type, protected);
+ gpa_t gpa = __vm_phy_pages_alloc(vm, pages, type, protected);
/*
* Find an unused range of virtual page addresses of at least
@@ -2087,11 +2085,39 @@ gpa_t ____vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
__builtin_unreachable();
}
-gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages, gpa_t min_gpa,
+gpa_t __vm_phy_pages_alloc(struct kvm_vm *vm, size_t nr_pages,
enum kvm_mem_region_type type, bool protected)
{
- TEST_ASSERT(type < NR_MEM_REGIONS,
- "Invalid memory region type '%u'", type);
+ struct userspace_mem_region *region = vm_get_mem_region(vm, type);
+ gpa_t min_gpa;
+
+ TEST_ASSERT(region, "No region for type '%u', memslot '%u'",
+ type, vm->memslots[type]);
+
+ switch (type) {
+ case MEM_REGION_CODE:
+ case MEM_REGION_DATA:
+ case MEM_REGION_TEST_DATA:
+ /*
+ * If the region is backed by the default memslot (id=0), use
+ * selftests' hardcoded minimum PFN, otherwise use the base of
+ * the custom memory slot that backs the region.
+ */
+ if (!vm->memslots[type])
+ min_gpa = KVM_UTIL_MIN_PFN * vm->page_size;
+ else
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ case MEM_REGION_PT:
+ min_gpa = KVM_GUEST_PAGE_TABLE_MIN_PADDR;
+ break;
+ case MEM_REGION_TEST_EXTRA:
+ min_gpa = region->region.guest_phys_addr;
+ break;
+ default:
+ TEST_FAIL("Invalid memory region type '%u'", type);
+ break;
+ }
return ____vm_phy_pages_alloc(vm, nr_pages, min_gpa, vm->memslots[type],
protected, false);
diff --git a/tools/testing/selftests/kvm/lib/x86/processor.c b/tools/testing/selftests/kvm/lib/x86/processor.c
index 39d9ca6ceb1d..479e9a481687 100644
--- a/tools/testing/selftests/kvm/lib/x86/processor.c
+++ b/tools/testing/selftests/kvm/lib/x86/processor.c
@@ -1474,8 +1474,7 @@ void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu, gpa_t smram_gpa,
vm_override_mem_region(vm, MEM_REGION_TEST_EXTRA, VM_MEM_SRC_ANONYMOUS,
smram_gpa, SMRAM_MEMSLOT, SMRAM_PAGES);
- TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, smram_gpa,
- MEM_REGION_TEST_EXTRA) == smram_gpa,
+ TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, MEM_REGION_TEST_EXTRA) == smram_gpa,
"Could not allocate guest physical addresses for SMRAM");
memset(addr_gpa2hva(vm, smram_gpa), 0x0, SMRAM_SIZE);
diff --git a/tools/testing/selftests/kvm/set_memory_region_test.c b/tools/testing/selftests/kvm/set_memory_region_test.c
index 160bbe3d7203..bfa5ac8ce029 100644
--- a/tools/testing/selftests/kvm/set_memory_region_test.c
+++ b/tools/testing/selftests/kvm/set_memory_region_test.c
@@ -124,7 +124,7 @@ static struct kvm_vm *spawn_vm(struct kvm_vcpu **vcpu, pthread_t *vcpu_thread,
* Allocate and map two pages so that the GPA accessed by guest_code()
* stays valid across the memslot move.
*/
- gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ gpa = vm_phy_pages_alloc(vm, 2, MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc\n");
virt_map(vm, MEM_REGION_GPA, MEM_REGION_GPA, 2);
diff --git a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
index 4e125eb5e0cf..8d1822717abd 100644
--- a/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
+++ b/tools/testing/selftests/kvm/x86/smaller_maxphyaddr_emulation_test.c
@@ -67,7 +67,7 @@ int main(int argc, char *argv[])
MEM_REGION_SIZE / PAGE_SIZE);
gpa = vm_phy_pages_alloc(vm, MEM_REGION_SIZE / PAGE_SIZE,
- MEM_REGION_GPA, MEM_REGION_TEST_EXTRA);
+ MEM_REGION_TEST_EXTRA);
TEST_ASSERT(gpa == MEM_REGION_GPA, "Failed vm_phy_pages_alloc");
virt_map(vm, MEM_REGION_GVA, MEM_REGION_GPA, 1);
hva = addr_gpa2hva(vm, MEM_REGION_GPA);
--
2.55.0.887.g758fc8c411-goog
--
kvm-riscv mailing list
kvm-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kvm-riscv
next prev parent reply other threads:[~2026-08-26 23:05 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 23:04 [PATCH 00/20] KVM: selftests: PPC pre-enabling Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` [PATCH 01/20] KVM: selftests: Use MEM_REGION_PT memslot instead of '0' for s390 regions/segments Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:13 ` sashiko-bot
2026-08-26 23:04 ` [PATCH 02/20] KVM: selftests: Bump the minimum GPA for page tables to 0x200000 Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:22 ` sashiko-bot
2026-08-26 23:38 ` Sean Christopherson
2026-08-27 6:34 ` Bibo Mao
2026-08-27 13:44 ` Sean Christopherson
2026-08-28 17:58 ` Claudio Imbrenda
2026-08-28 17:58 ` Claudio Imbrenda
2026-08-28 17:58 ` Claudio Imbrenda
2026-08-28 18:07 ` Sean Christopherson
2026-08-28 18:07 ` Sean Christopherson
2026-08-28 18:07 ` Sean Christopherson
2026-08-31 11:34 ` Claudio Imbrenda
2026-08-31 11:34 ` Claudio Imbrenda
2026-08-31 11:34 ` Claudio Imbrenda
2026-08-26 23:04 ` [PATCH 03/20] KVM: selftests: Use vm_alloc_page_table() to allocate LoongArch page tables Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-27 6:43 ` Bibo Mao
2026-08-27 6:43 ` Bibo Mao
2026-08-27 6:43 ` Bibo Mao
2026-08-26 23:04 ` [PATCH 04/20] KVM: selftests: Rename "num" param to "nr_pages" for physical page allocators Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:12 ` sashiko-bot
2026-08-26 23:04 ` [PATCH 05/20] KVM: selftests: Use goto instead of do-while to retry finding unused physical pages Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-09-02 17:50 ` Gautam Menghani
2026-09-02 17:50 ` Gautam Menghani
2026-09-02 17:50 ` Gautam Menghani
2026-08-26 23:04 ` [PATCH 06/20] KVM: selftests: Extend page allocator to support naturally aligned allocations Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` [PATCH 07/20] KVM: selftests: Make the single-page allocator APIs static inline Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` [PATCH 08/20] KVM: selftests: Use the innermost page allocator API in the memslot perf test Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:04 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 09/20] KVM: selftests: Use the innermost page allocator API in s390's IRQ routing test Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 10/20] KVM: selftests: Add a wrapper API to allocate multiple page table pages Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-27 5:27 ` Itaru Kitayama
2026-08-27 5:27 ` Itaru Kitayama
2026-08-27 5:27 ` Itaru Kitayama
2026-09-02 17:51 ` Gautam Menghani
2026-09-02 17:51 ` Gautam Menghani
2026-09-02 17:51 ` Gautam Menghani
2026-08-26 23:05 ` [PATCH 11/20] KVM: selftests: Initialize vm->memslots[] with invalid memslots during creation Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-09-02 17:52 ` Gautam Menghani
2026-09-02 17:52 ` Gautam Menghani
2026-09-02 17:52 ` Gautam Menghani
2026-08-26 23:05 ` [PATCH 12/20] KVM: selftests: Add APIs to override memory region types with custom memslots Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 13/20] KVM: selftests: Add TEST_EXTRA memory region type for "special" memslots Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:15 ` sashiko-bot
2026-08-27 4:37 ` Itaru Kitayama
2026-08-27 4:37 ` Itaru Kitayama
2026-08-27 4:37 ` Itaru Kitayama
2026-08-26 23:05 ` [PATCH 14/20] KVM: selftests: Use TEST_EXTRA region in arm64's vGIC LPI stress test Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 15/20] KVM: selftests: Use TEST_EXTRA region in x86's smaller MAXPHYADDR test Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 16/20] KVM: selftests: Use TEST_EXTRA region in set memory region test Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 17/20] KVM: selftests: Take the memory region type, not memslot, in page allocators Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` [PATCH 18/20] KVM: selftests: Use TEST_ASSERT(), not assert(), in vm_get_mem_region() Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson [this message]
2026-08-26 23:05 ` [PATCH 19/20] KVM: selftests: Automatically pick min_gpa for allocations based on region type Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:19 ` sashiko-bot
2026-08-26 23:05 ` [PATCH 20/20] KVM: selftests: Add arch hook to force page tables to be naturally aligned Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:05 ` Sean Christopherson
2026-08-26 23:18 ` sashiko-bot
2026-08-27 8:07 ` [PATCH 00/20] KVM: selftests: PPC pre-enabling Itaru Kitayama
2026-08-27 8:07 ` Itaru Kitayama
2026-08-27 8:07 ` Itaru Kitayama
2026-09-02 17:47 ` Gautam Menghani
2026-09-02 17:47 ` Gautam Menghani
2026-09-02 17:47 ` Gautam Menghani
2026-09-02 17:53 ` Sean Christopherson
2026-09-02 17:53 ` Sean Christopherson
2026-09-02 17:53 ` Sean Christopherson
2026-09-02 17:59 ` Ritesh Harjani
2026-09-02 17:59 ` Ritesh Harjani
2026-09-02 17:59 ` Ritesh Harjani
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=20260826230511.972824-20-seanjc@google.com \
--to=seanjc@google.com \
--cc=alex@ghiti.fr \
--cc=anup@brainfault.org \
--cc=aou@eecs.berkeley.edu \
--cc=atish.patra@linux.dev \
--cc=borntraeger@linux.ibm.com \
--cc=chenhuacai@kernel.org \
--cc=david@kernel.org \
--cc=frankja@linux.ibm.com \
--cc=fuad.tabba@linux.dev \
--cc=imbrenda@linux.ibm.com \
--cc=joey.gouly@arm.com \
--cc=kvm-riscv@lists.infradead.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=loongarch@lists.linux.dev \
--cc=maobibo@loongson.cn \
--cc=maz@kernel.org \
--cc=npiggin@gmail.com \
--cc=oupton@kernel.org \
--cc=palmer@dabbelt.com \
--cc=pbonzini@redhat.com \
--cc=pjw@kernel.org \
--cc=ritesh.list@gmail.com \
--cc=seiden@linux.ibm.com \
--cc=suzuki.poulose@arm.com \
--cc=yuzenghui@huawei.com \
--cc=zhaotianrui@loongson.cn \
/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.