KVM: Initialize kvm before registering the mmu notifier
It doesn't make sense to ever see a half-initialized kvm structure on
mmu notifier callbacks. Previously, 85722cda
changed the ordering to
ensure that the mmu_lock was initialized before mmu notifier
registration, but there is still a race where the mmu notifier could
come in and try accessing other portions of struct kvm before they are
intialized.
Solve this by moving the mmu notifier registration to occur after the
structure is completely initialized.
Google-Bug-Id: 452199
Signed-off-by: Mike Waychison <mikew@google.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
221192bdff
commit
74b5c5bfff
1 changed files with 6 additions and 5 deletions
|
@ -467,12 +467,8 @@ static struct kvm *kvm_create_vm(void)
|
||||||
if (!kvm->buses[i])
|
if (!kvm->buses[i])
|
||||||
goto out_err;
|
goto out_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_init(&kvm->mmu_lock);
|
spin_lock_init(&kvm->mmu_lock);
|
||||||
|
|
||||||
r = kvm_init_mmu_notifier(kvm);
|
|
||||||
if (r)
|
|
||||||
goto out_err;
|
|
||||||
|
|
||||||
kvm->mm = current->mm;
|
kvm->mm = current->mm;
|
||||||
atomic_inc(&kvm->mm->mm_count);
|
atomic_inc(&kvm->mm->mm_count);
|
||||||
kvm_eventfd_init(kvm);
|
kvm_eventfd_init(kvm);
|
||||||
|
@ -480,6 +476,11 @@ static struct kvm *kvm_create_vm(void)
|
||||||
mutex_init(&kvm->irq_lock);
|
mutex_init(&kvm->irq_lock);
|
||||||
mutex_init(&kvm->slots_lock);
|
mutex_init(&kvm->slots_lock);
|
||||||
atomic_set(&kvm->users_count, 1);
|
atomic_set(&kvm->users_count, 1);
|
||||||
|
|
||||||
|
r = kvm_init_mmu_notifier(kvm);
|
||||||
|
if (r)
|
||||||
|
goto out_err;
|
||||||
|
|
||||||
raw_spin_lock(&kvm_lock);
|
raw_spin_lock(&kvm_lock);
|
||||||
list_add(&kvm->vm_list, &vm_list);
|
list_add(&kvm->vm_list, &vm_list);
|
||||||
raw_spin_unlock(&kvm_lock);
|
raw_spin_unlock(&kvm_lock);
|
||||||
|
|
Loading…
Reference in a new issue