lkml.org 
[lkml]   [2016]   [Apr]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 014/210] KVM: fix spin_lock_init order on x86
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Paolo Bonzini <pbonzini@redhat.com>

    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.

    Reported-by: Borislav Petkov <bp@alien8.de>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    virt/kvm/kvm_main.c | 21 +++++++++++----------
    1 file changed, 11 insertions(+), 10 deletions(-)

    --- a/virt/kvm/kvm_main.c
    +++ b/virt/kvm/kvm_main.c
    @@ -547,6 +547,16 @@ static struct kvm *kvm_create_vm(unsigne
    if (!kvm)
    return ERR_PTR(-ENOMEM);

    + spin_lock_init(&kvm->mmu_lock);
    + atomic_inc(&current->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;
    @@ -579,16 +589,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;
    @@ -613,6 +613,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);
    }


    \
     
     \ /
      Last update: 2016-04-10 21:21    [W:4.185 / U:0.128 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site