From 85722cda308c0ad7390dc910139b2ce58c11b9c4 Mon Sep 17 00:00:00 2001 From: OGAWA Hirofumi Date: Wed, 11 May 2011 09:28:28 +0900 Subject: [PATCH] KVM: Fix kvm mmu_notifier initialization order Like the following, mmu_notifier can be called after registering immediately. So, kvm have to initialize kvm->mmu_lock before it. BUG: spinlock bad magic on CPU#0, kswapd0/342 lock: ffff8800af8c4000, .magic: 00000000, .owner: /-1, .owner_cpu: 0 Pid: 342, comm: kswapd0 Not tainted 2.6.39-rc5+ #1 Call Trace: [] spin_bug+0x9c/0xa3 [] do_raw_spin_lock+0x29/0x13c [] ? flush_tlb_others_ipi+0xaf/0xfd [] _raw_spin_lock+0x9/0xb [] kvm_mmu_notifier_clear_flush_young+0x2c/0x66 [kvm] [] __mmu_notifier_clear_flush_young+0x2b/0x57 [] page_referenced_one+0x88/0xea [] page_referenced+0x1fc/0x256 [] shrink_page_list+0x187/0x53a [] shrink_inactive_list+0x1e0/0x33d [] ? determine_dirtyable_memory+0x15/0x27 [] ? call_function_single_interrupt+0xe/0x20 [] shrink_zone+0x322/0x3de [] ? zone_watermark_ok_safe+0xe2/0xf1 [] kswapd+0x516/0x818 [] ? shrink_zone+0x3de/0x3de [] kthread+0x7d/0x85 [] kernel_thread_helper+0x4/0x10 [] ? __init_kthread_worker+0x37/0x37 [] ? gs_change+0xb/0xb Signed-off-by: OGAWA Hirofumi Signed-off-by: Avi Kivity --- virt/kvm/kvm_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index ed3c4e7c100..22cdb960660 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -467,6 +467,7 @@ static struct kvm *kvm_create_vm(void) if (!kvm->buses[i]) goto out_err; } + spin_lock_init(&kvm->mmu_lock); r = kvm_init_mmu_notifier(kvm); if (r) @@ -474,7 +475,6 @@ static struct kvm *kvm_create_vm(void) kvm->mm = current->mm; atomic_inc(&kvm->mm->mm_count); - spin_lock_init(&kvm->mmu_lock); kvm_eventfd_init(kvm); mutex_init(&kvm->lock); mutex_init(&kvm->irq_lock);