aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2011-06-03 16:04:53 -0400
committerAvi Kivity <avi@redhat.com>2011-06-06 04:27:52 -0400
commit74b5c5bfff429f464c38dd49af41d75cf0e7dc26 (patch)
treef191213a9807e88ca24c2aaf123734892fe9e792 /virt/kvm
parent221192bdff2583834984639121595fc9296120d3 (diff)
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>
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/kvm_main.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 383f492a6603..96ebc0679415 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -467,12 +467,8 @@ static struct kvm *kvm_create_vm(void)
467 if (!kvm->buses[i]) 467 if (!kvm->buses[i])
468 goto out_err; 468 goto out_err;
469 } 469 }
470 spin_lock_init(&kvm->mmu_lock);
471
472 r = kvm_init_mmu_notifier(kvm);
473 if (r)
474 goto out_err;
475 470
471 spin_lock_init(&kvm->mmu_lock);
476 kvm->mm = current->mm; 472 kvm->mm = current->mm;
477 atomic_inc(&kvm->mm->mm_count); 473 atomic_inc(&kvm->mm->mm_count);
478 kvm_eventfd_init(kvm); 474 kvm_eventfd_init(kvm);
@@ -480,6 +476,11 @@ static struct kvm *kvm_create_vm(void)
480 mutex_init(&kvm->irq_lock); 476 mutex_init(&kvm->irq_lock);
481 mutex_init(&kvm->slots_lock); 477 mutex_init(&kvm->slots_lock);
482 atomic_set(&kvm->users_count, 1); 478 atomic_set(&kvm->users_count, 1);
479
480 r = kvm_init_mmu_notifier(kvm);
481 if (r)
482 goto out_err;
483
483 raw_spin_lock(&kvm_lock); 484 raw_spin_lock(&kvm_lock);
484 list_add(&kvm->vm_list, &vm_list); 485 list_add(&kvm->vm_list, &vm_list);
485 raw_spin_unlock(&kvm_lock); 486 raw_spin_unlock(&kvm_lock);