|
@@ -536,6 +536,16 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|
|
if (!kvm)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
+ spin_lock_init(&kvm->mmu_lock);
|
|
|
+ atomic_inc(¤t->mm->mm_count);
|
|
|
+ kvm->mm = current->mm;
|
|
|
+ kvm_eventfd_init(kvm);
|
|
|
+ mutex_init(&kvm->lock);
|
|
|
+ mutex_init(&kvm->irq_lock);
|
|
|
+ mutex_init(&kvm->slots_lock);
|
|
|
+ atomic_set(&kvm->users_count, 1);
|
|
|
+ INIT_LIST_HEAD(&kvm->devices);
|
|
|
+
|
|
|
r = kvm_arch_init_vm(kvm, type);
|
|
|
if (r)
|
|
|
goto out_err_no_disable;
|
|
@@ -568,16 +578,6 @@ static struct kvm *kvm_create_vm(unsigned long type)
|
|
|
goto out_err;
|
|
|
}
|
|
|
|
|
|
- spin_lock_init(&kvm->mmu_lock);
|
|
|
- kvm->mm = current->mm;
|
|
|
- atomic_inc(&kvm->mm->mm_count);
|
|
|
- kvm_eventfd_init(kvm);
|
|
|
- mutex_init(&kvm->lock);
|
|
|
- mutex_init(&kvm->irq_lock);
|
|
|
- mutex_init(&kvm->slots_lock);
|
|
|
- atomic_set(&kvm->users_count, 1);
|
|
|
- INIT_LIST_HEAD(&kvm->devices);
|
|
|
-
|
|
|
r = kvm_init_mmu_notifier(kvm);
|
|
|
if (r)
|
|
|
goto out_err;
|
|
@@ -602,6 +602,7 @@ out_err_no_disable:
|
|
|
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++)
|
|
|
kvm_free_memslots(kvm, kvm->memslots[i]);
|
|
|
kvm_arch_free_vm(kvm);
|
|
|
+ mmdrop(current->mm);
|
|
|
return ERR_PTR(r);
|
|
|
}
|
|
|
|