diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c b/arch/arm64/kvm/hyp/nvhe/mem_protect.c index ab10ffb80558..7d742c771a1b 100644 --- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c +++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c @@ -1455,7 +1455,7 @@ static int check_donation(struct pkvm_mem_donation *donation) if (ret) return ret; - switch (tx->completer.id){ + switch (tx->completer.id) { case PKVM_ID_HOST: ret = host_ack_donation(completer_addr, tx); break; @@ -1492,7 +1492,7 @@ static int __do_donate(struct pkvm_mem_donation *donation) if (ret) return ret; - switch (tx->completer.id){ + switch (tx->completer.id) { case PKVM_ID_HOST: ret = host_complete_donation(completer_addr, tx); break; diff --git a/arch/arm64/kvm/hyp/nvhe/page_alloc.c b/arch/arm64/kvm/hyp/nvhe/page_alloc.c index 01976a58d850..11b190ff49d1 100644 --- a/arch/arm64/kvm/hyp/nvhe/page_alloc.c +++ b/arch/arm64/kvm/hyp/nvhe/page_alloc.c @@ -99,6 +99,7 @@ static void __hyp_attach_page(struct hyp_pool *pool, memset(hyp_page_to_virt(p), 0, PAGE_SIZE << p->order); + /* Skip coalescing for 'external' pages being freed into the pool. */ if (phys < pool->range_start || phys >= pool->range_end) goto insert; diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index cc7e92e93d05..12d5728d2b04 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -654,7 +654,7 @@ static void unmap_donated_memory_noclear(void *va, size_t size) * * Unmaps the donated memory from the host at stage 2. * - * kvm: A pointer to the host's struct kvm. + * host_kvm: A pointer to the host's struct kvm. * vm_hva: The host va of the area being donated for the VM state. * Must be page aligned. * pgd_hva: The host va of the area being donated for the stage-2 PGD for @@ -802,6 +802,7 @@ int __pkvm_teardown_vm(pkvm_handle_t handle) size_t vm_size, last_ran_size; int __percpu *last_vcpu_ran; struct pkvm_hyp_vm *hyp_vm; + struct kvm *host_kvm; unsigned int idx; int err; @@ -817,21 +818,21 @@ int __pkvm_teardown_vm(pkvm_handle_t handle) goto err_unlock; } + host_kvm = hyp_vm->host_kvm; + /* Ensure the VMID is clean before it can be reallocated */ __kvm_tlb_flush_vmid(&hyp_vm->kvm.arch.mmu); remove_vm_table_entry(handle); hyp_spin_unlock(&vm_table_lock); - mc = &hyp_vm->host_kvm->arch.pkvm.teardown_mc; - stage2_mc = &hyp_vm->host_kvm->arch.pkvm.teardown_stage2_mc; + mc = &host_kvm->arch.pkvm.teardown_mc; + stage2_mc = &host_kvm->arch.pkvm.teardown_stage2_mc; /* Reclaim guest pages (including page-table pages) */ reclaim_guest_pages(hyp_vm, stage2_mc); unpin_host_vcpus(hyp_vm->vcpus, hyp_vm->nr_vcpus); /* Push the metadata pages to the teardown memcache */ - hyp_unpin_shared_mem(hyp_vm->host_kvm, hyp_vm->host_kvm + 1); - for (idx = 0; idx < hyp_vm->nr_vcpus; ++idx) { struct pkvm_hyp_vcpu *hyp_vcpu = hyp_vm->vcpus[idx]; struct kvm_hyp_memcache *vcpu_mc; @@ -854,6 +855,7 @@ int __pkvm_teardown_vm(pkvm_handle_t handle) vm_size = pkvm_get_hyp_vm_size(hyp_vm->kvm.created_vcpus); teardown_donated_memory(mc, hyp_vm, vm_size); + hyp_unpin_shared_mem(host_kvm, host_kvm + 1); return 0; err_unlock: