From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756688AbcCUOrU (ORCPT ); Mon, 21 Mar 2016 10:47:20 -0400 Received: from mail-pf0-f171.google.com ([209.85.192.171]:33179 "EHLO mail-pf0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756151AbcCUOrS (ORCPT ); Mon, 21 Mar 2016 10:47:18 -0400 Message-ID: <1458571635.10868.18.camel@edumazet-glaptop3.roam.corp.google.com> Subject: Re: [PATCH] KVM: fix spin_lock_init order on x86 From: Eric Dumazet To: Paolo Bonzini Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, bp@alien8.de Date: Mon, 21 Mar 2016 07:47:15 -0700 In-Reply-To: <1458552292-7405-1-git-send-email-pbonzini@redhat.com> References: <1458552292-7405-1-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2016-03-21 at 10:24 +0100, Paolo Bonzini wrote: > kvm_arch_init_vm is now using mmu_lock, causing lockdep to > complain: ... > > Reported-by: Borislav Petkov > Signed-off-by: Paolo Bonzini > --- > virt/kvm/kvm_main.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index 7ba1d10ffed2..cb45b86a1c48 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -536,6 +536,16 @@ static struct kvm *kvm_create_vm(unsigned long type) > if (!kvm) > return ERR_PTR(-ENOMEM); > > + spin_lock_init(&kvm->mmu_lock); > + kvm->mm = current->mm; > + atomic_inc(&kvm->mm->mm_count); current->mm->mm_count is incremented here. > + 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; But out_err_no_disable wont decrement it in case of an error. This is not clear to me where the cleanup is done ? > @@ -568,16 +578,6 @@ static struct kvm *kvm_create_vm(unsigned long type) > 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;