diff options
-rw-r--r-- | drivers/kvm/kvm_main.c | 15 | ||||
-rw-r--r-- | drivers/kvm/mmu.c | 4 |
2 files changed, 17 insertions, 2 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 3c3231d8dabf..3ff8ee56279c 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -381,6 +381,16 @@ static void free_pio_guest_pages(struct kvm_vcpu *vcpu) | |||
381 | } | 381 | } |
382 | } | 382 | } |
383 | 383 | ||
384 | static void kvm_unload_vcpu_mmu(struct kvm_vcpu *vcpu) | ||
385 | { | ||
386 | if (!vcpu->vmcs) | ||
387 | return; | ||
388 | |||
389 | vcpu_load(vcpu); | ||
390 | kvm_mmu_unload(vcpu); | ||
391 | vcpu_put(vcpu); | ||
392 | } | ||
393 | |||
384 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) | 394 | static void kvm_free_vcpu(struct kvm_vcpu *vcpu) |
385 | { | 395 | { |
386 | if (!vcpu->vmcs) | 396 | if (!vcpu->vmcs) |
@@ -401,6 +411,11 @@ static void kvm_free_vcpus(struct kvm *kvm) | |||
401 | { | 411 | { |
402 | unsigned int i; | 412 | unsigned int i; |
403 | 413 | ||
414 | /* | ||
415 | * Unpin any mmu pages first. | ||
416 | */ | ||
417 | for (i = 0; i < KVM_MAX_VCPUS; ++i) | ||
418 | kvm_unload_vcpu_mmu(&kvm->vcpus[i]); | ||
404 | for (i = 0; i < KVM_MAX_VCPUS; ++i) | 419 | for (i = 0; i < KVM_MAX_VCPUS; ++i) |
405 | kvm_free_vcpu(&kvm->vcpus[i]); | 420 | kvm_free_vcpu(&kvm->vcpus[i]); |
406 | } | 421 | } |
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index 5915d7a1c4f7..d4de988d1828 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -838,11 +838,12 @@ static void mmu_free_roots(struct kvm_vcpu *vcpu) | |||
838 | int i; | 838 | int i; |
839 | struct kvm_mmu_page *page; | 839 | struct kvm_mmu_page *page; |
840 | 840 | ||
841 | if (!VALID_PAGE(vcpu->mmu.root_hpa)) | ||
842 | return; | ||
841 | #ifdef CONFIG_X86_64 | 843 | #ifdef CONFIG_X86_64 |
842 | if (vcpu->mmu.shadow_root_level == PT64_ROOT_LEVEL) { | 844 | if (vcpu->mmu.shadow_root_level == PT64_ROOT_LEVEL) { |
843 | hpa_t root = vcpu->mmu.root_hpa; | 845 | hpa_t root = vcpu->mmu.root_hpa; |
844 | 846 | ||
845 | ASSERT(VALID_PAGE(root)); | ||
846 | page = page_header(root); | 847 | page = page_header(root); |
847 | --page->root_count; | 848 | --page->root_count; |
848 | vcpu->mmu.root_hpa = INVALID_PAGE; | 849 | vcpu->mmu.root_hpa = INVALID_PAGE; |
@@ -853,7 +854,6 @@ static void mmu_free_roots(struct kvm_vcpu *vcpu) | |||
853 | hpa_t root = vcpu->mmu.pae_root[i]; | 854 | hpa_t root = vcpu->mmu.pae_root[i]; |
854 | 855 | ||
855 | if (root) { | 856 | if (root) { |
856 | ASSERT(VALID_PAGE(root)); | ||
857 | root &= PT64_BASE_ADDR_MASK; | 857 | root &= PT64_BASE_ADDR_MASK; |
858 | page = page_header(root); | 858 | page = page_header(root); |
859 | --page->root_count; | 859 | --page->root_count; |