Patch "KVM: fix spin_lock_init order on x86" has been added to the 3.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
KVM: fix spin_lock_init order on x86
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-fix-spin_lock_init-order-on-x86.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
e9ad4ec8379ad1ba6f68b8ca1c26b50b5ae0a327Mon Sep 17 00:00:00 2001
From: Paolo Bonzini <[email protected]>
Date: Mon, 21 Mar 2016 10:15:25 +0100
Subject: KVM: fix spin_lock_init order on x86
From: Paolo Bonzini <[email protected]>
commit e9ad4ec8379ad1ba6f68b8ca1c26b50b5ae0a327 upstream.
Moving the initialization earlier is needed in 4.6 because kvm_arch_init_vm is now using mmu_lock, causing lockdep to complain:
[ 284.440294] INFO: trying to register non-static key. [ 284.445259] the code is fine but needs lockdep annotation. [ 284.450736] turning off the locking correctness validator. ... [ 284.528318] [<ffffffff810aecc3>] lock_acquire+0xd3/0x240 [ 284.533733] [<ffffffffa0305aa0>] ? kvm_page_track_register_notifier+0x20/0x60 [kvm] [ 284.541467] [<ffffffff81715581>] _raw_spin_lock+0x41/0x80 [ 284.546960] [<ffffffffa0305aa0>] ? kvm_page_track_register_notifier+0x20/0x60 [kvm] [ 284.554707] [<ffffffffa0305aa0>] kvm_page_track_register_notifier+0x20/0x60 [kvm] [ 284.562281] [<ffffffffa02ece70>] kvm_mmu_init_vm+0x20/0x30 [kvm] [ 284.568381] [<ffffffffa02dbf7a>] kvm_arch_init_vm+0x1ea/0x200 [kvm] [ 284.574740] [<ffffffffa02bff3f>] kvm_dev_ioctl+0xbf/0x4d0 [kvm]
However, it also helps fixing a preexisting problem, which is why this patch is also good for stable kernels: kvm_create_vm was incrementing current->mm->mm_count but not decrementing it at the out_err label (in case kvm_init_mmu_notifier failed). The new initialization order makes it possible to add the required mmdrop without adding a new error label.
--- virt/kvm/kvm_main.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
virt/kvm/kvm_main.c +11 -10
@@ -454,6 +454,16 @@ static struct kvm *kvm_create_vm(unsigneif (!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_nodisable;
@@ -483,16 +493,6 @@ static struct kvm *kvm_create_vm(unsigne 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;
@@ -512,6 +512,7 @@ out_err_nodisable:kfree (kvm->buses[i]);kfree (kvm->memslots);kvm_arch_free_vm (kvm); +mmdrop (current->mm);return ERR_PTR (r); }
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/kvm-i8254-change-pit-discard-tick-policy.patch queue-3.14/kvm-fix-spin_lock_init-order-on-x86.patch queue-3.14/kvm-vmx-avoid-guest-hang-on-invalid-invept-instruction.patch