diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h index bca07c6d0460f916ea36be22a40a8f329344a01e..5e7be150466411be852d473cf79c66c25fd5a4a5 100644 --- a/drivers/kvm/kvm.h +++ b/drivers/kvm/kvm.h @@ -495,9 +495,9 @@ void vcpu_put(struct kvm_vcpu *vcpu); void decache_vcpus_on_cpu(int cpu); -int kvm_init_x86(struct kvm_x86_ops *ops, unsigned int vcpu_size, +int kvm_init(struct kvm_x86_ops *ops, unsigned int vcpu_size, struct module *module); -void kvm_exit_x86(void); +void kvm_exit(void); int kvm_mmu_module_init(void); void kvm_mmu_module_exit(void); diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 7fdfed52dbe731cdcf764cc04d81959dfb5ca95e..2b3736e7483ceedb37fa7d07b4a1e4d77b91e67b 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -1434,12 +1434,27 @@ static void kvm_sched_out(struct preempt_notifier *pn, kvm_arch_vcpu_put(vcpu); } -int kvm_init_x86(struct kvm_x86_ops *ops, unsigned int vcpu_size, +int kvm_init(struct kvm_x86_ops *ops, unsigned int vcpu_size, struct module *module) { int r; int cpu; + r = kvm_mmu_module_init(); + if (r) + goto out4; + + kvm_init_debug(); + + kvm_arch_init(); + + bad_page = alloc_page(GFP_KERNEL | __GFP_ZERO); + + if (bad_page == NULL) { + r = -ENOMEM; + goto out; + } + if (kvm_x86_ops) { printk(KERN_ERR "kvm: already loaded the other module\n"); return -EEXIST; @@ -1520,11 +1535,14 @@ int kvm_init_x86(struct kvm_x86_ops *ops, unsigned int vcpu_size, kvm_arch_hardware_unsetup(); out: kvm_x86_ops = NULL; + kvm_exit_debug(); + kvm_mmu_module_exit(); +out4: return r; } -EXPORT_SYMBOL_GPL(kvm_init_x86); +EXPORT_SYMBOL_GPL(kvm_init); -void kvm_exit_x86(void) +void kvm_exit(void) { misc_deregister(&kvm_dev); kmem_cache_destroy(kvm_vcpu_cache); @@ -1535,43 +1553,8 @@ void kvm_exit_x86(void) on_each_cpu(hardware_disable, NULL, 0, 1); kvm_arch_hardware_unsetup(); kvm_x86_ops = NULL; -} -EXPORT_SYMBOL_GPL(kvm_exit_x86); - -static __init int kvm_init(void) -{ - int r; - - r = kvm_mmu_module_init(); - if (r) - goto out4; - - kvm_init_debug(); - - kvm_arch_init(); - - bad_page = alloc_page(GFP_KERNEL | __GFP_ZERO); - - if (bad_page == NULL) { - r = -ENOMEM; - goto out; - } - - return 0; - -out: - kvm_exit_debug(); - kvm_mmu_module_exit(); -out4: - return r; -} - -static __exit void kvm_exit(void) -{ kvm_exit_debug(); __free_page(bad_page); kvm_mmu_module_exit(); } - -module_init(kvm_init) -module_exit(kvm_exit) +EXPORT_SYMBOL_GPL(kvm_exit); diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c index 97863f8fd0018672c10f10a1273982f6d242cff2..0ccbef18476af55ebbb3baac0e4cb706f289cf12 100644 --- a/drivers/kvm/svm.c +++ b/drivers/kvm/svm.c @@ -1723,13 +1723,13 @@ static struct kvm_x86_ops svm_x86_ops = { static int __init svm_init(void) { - return kvm_init_x86(&svm_x86_ops, sizeof(struct vcpu_svm), + return kvm_init(&svm_x86_ops, sizeof(struct vcpu_svm), THIS_MODULE); } static void __exit svm_exit(void) { - kvm_exit_x86(); + kvm_exit(); } module_init(svm_init) diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index c3bde7532714e7528236a5639a56b5aab85ef54d..529162345c1215baaec1dd15ae55f4baecf6d5aa 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c @@ -2677,7 +2677,7 @@ static int __init vmx_init(void) memset(iova, 0xff, PAGE_SIZE); kunmap(vmx_io_bitmap_b); - r = kvm_init_x86(&vmx_x86_ops, sizeof(struct vcpu_vmx), THIS_MODULE); + r = kvm_init(&vmx_x86_ops, sizeof(struct vcpu_vmx), THIS_MODULE); if (r) goto out1; @@ -2698,7 +2698,7 @@ static void __exit vmx_exit(void) __free_page(vmx_io_bitmap_b); __free_page(vmx_io_bitmap_a); - kvm_exit_x86(); + kvm_exit(); } module_init(vmx_init)