aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/kvm/x86.c')
-rw-r--r--drivers/kvm/x86.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/kvm/x86.c b/drivers/kvm/x86.c
index abb7beeb8f54..b7c72ac36735 100644
--- a/drivers/kvm/x86.c
+++ b/drivers/kvm/x86.c
@@ -2543,3 +2543,50 @@ void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
2543 kvm_mmu_destroy(vcpu); 2543 kvm_mmu_destroy(vcpu);
2544 free_page((unsigned long)vcpu->pio_data); 2544 free_page((unsigned long)vcpu->pio_data);
2545} 2545}
2546
2547struct kvm *kvm_arch_create_vm(void)
2548{
2549 struct kvm *kvm = kzalloc(sizeof(struct kvm), GFP_KERNEL);
2550
2551 if (!kvm)
2552 return ERR_PTR(-ENOMEM);
2553
2554 INIT_LIST_HEAD(&kvm->active_mmu_pages);
2555
2556 return kvm;
2557}
2558
2559static void kvm_unload_vcpu_mmu(struct kvm_vcpu *vcpu)
2560{
2561 vcpu_load(vcpu);
2562 kvm_mmu_unload(vcpu);
2563 vcpu_put(vcpu);
2564}
2565
2566static void kvm_free_vcpus(struct kvm *kvm)
2567{
2568 unsigned int i;
2569
2570 /*
2571 * Unpin any mmu pages first.
2572 */
2573 for (i = 0; i < KVM_MAX_VCPUS; ++i)
2574 if (kvm->vcpus[i])
2575 kvm_unload_vcpu_mmu(kvm->vcpus[i]);
2576 for (i = 0; i < KVM_MAX_VCPUS; ++i) {
2577 if (kvm->vcpus[i]) {
2578 kvm_arch_vcpu_free(kvm->vcpus[i]);
2579 kvm->vcpus[i] = NULL;
2580 }
2581 }
2582
2583}
2584
2585void kvm_arch_destroy_vm(struct kvm *kvm)
2586{
2587 kfree(kvm->vpic);
2588 kfree(kvm->vioapic);
2589 kvm_free_vcpus(kvm);
2590 kvm_free_physmem(kvm);
2591 kfree(kvm);
2592}