Skip to content

Commit 8c0d7d1

Browse files
vdonnefortoupton
authored andcommitted
KVM: arm64: Distinct pKVM teardown memcache for stage-2
In order to account for memory dedicated to the stage-2 page-tables, use a separated memcache when tearing down the VM. Meanwhile rename reclaim_guest_pages to reflect the fact it only reclaim page-table pages. Signed-off-by: Vincent Donnefort <vdonnefort@google.com> Acked-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20250313114038.1502357-3-vdonnefort@google.com Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent cf2d228 commit 8c0d7d1

File tree

5 files changed

+8
-6
lines changed

5 files changed

+8
-6
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ typedef unsigned int pkvm_handle_t;
246246
struct kvm_protected_vm {
247247
pkvm_handle_t handle;
248248
struct kvm_hyp_memcache teardown_mc;
249+
struct kvm_hyp_memcache stage2_teardown_mc;
249250
bool enabled;
250251
};
251252

arch/arm64/kvm/hyp/include/nvhe/mem_protect.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void handle_host_mem_abort(struct kvm_cpu_context *host_ctxt);
5656

5757
int hyp_pin_shared_mem(void *from, void *to);
5858
void hyp_unpin_shared_mem(void *from, void *to);
59-
void reclaim_guest_pages(struct pkvm_hyp_vm *vm, struct kvm_hyp_memcache *mc);
59+
void reclaim_pgtable_pages(struct pkvm_hyp_vm *vm, struct kvm_hyp_memcache *mc);
6060
int refill_memcache(struct kvm_hyp_memcache *mc, unsigned long min_pages,
6161
struct kvm_hyp_memcache *host_mc);
6262

arch/arm64/kvm/hyp/nvhe/mem_protect.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ int kvm_guest_prepare_stage2(struct pkvm_hyp_vm *vm, void *pgd)
266266
return 0;
267267
}
268268

269-
void reclaim_guest_pages(struct pkvm_hyp_vm *vm, struct kvm_hyp_memcache *mc)
269+
void reclaim_pgtable_pages(struct pkvm_hyp_vm *vm, struct kvm_hyp_memcache *mc)
270270
{
271271
struct hyp_page *page;
272272
void *addr;

arch/arm64/kvm/hyp/nvhe/pkvm.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,7 @@ teardown_donated_memory(struct kvm_hyp_memcache *mc, void *addr, size_t size)
678678

679679
int __pkvm_teardown_vm(pkvm_handle_t handle)
680680
{
681-
struct kvm_hyp_memcache *mc;
681+
struct kvm_hyp_memcache *mc, *stage2_mc;
682682
struct pkvm_hyp_vm *hyp_vm;
683683
struct kvm *host_kvm;
684684
unsigned int idx;
@@ -706,18 +706,18 @@ int __pkvm_teardown_vm(pkvm_handle_t handle)
706706

707707
/* Reclaim guest pages (including page-table pages) */
708708
mc = &host_kvm->arch.pkvm.teardown_mc;
709-
reclaim_guest_pages(hyp_vm, mc);
709+
stage2_mc = &host_kvm->arch.pkvm.stage2_teardown_mc;
710+
reclaim_pgtable_pages(hyp_vm, stage2_mc);
710711
unpin_host_vcpus(hyp_vm->vcpus, hyp_vm->nr_vcpus);
711712

712-
/* Push the metadata pages to the teardown memcache */
713713
for (idx = 0; idx < hyp_vm->nr_vcpus; ++idx) {
714714
struct pkvm_hyp_vcpu *hyp_vcpu = hyp_vm->vcpus[idx];
715715
struct kvm_hyp_memcache *vcpu_mc = &hyp_vcpu->vcpu.arch.pkvm_memcache;
716716

717717
while (vcpu_mc->nr_pages) {
718718
void *addr = pop_hyp_memcache(vcpu_mc, hyp_phys_to_virt);
719719

720-
push_hyp_memcache(mc, addr, hyp_virt_to_phys);
720+
push_hyp_memcache(stage2_mc, addr, hyp_virt_to_phys);
721721
unmap_donated_memory_noclear(addr, PAGE_SIZE);
722722
}
723723

arch/arm64/kvm/pkvm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm)
111111

112112
host_kvm->arch.pkvm.handle = 0;
113113
free_hyp_memcache(&host_kvm->arch.pkvm.teardown_mc);
114+
free_hyp_memcache(&host_kvm->arch.pkvm.stage2_teardown_mc);
114115
}
115116

116117
/*

0 commit comments

Comments
 (0)