linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] KVM: fix spin_lock_init order on x86
@ 2016-03-21  9:24 Paolo Bonzini
  2016-03-21 14:47 ` Eric Dumazet
  0 siblings, 1 reply; 4+ messages in thread
From: Paolo Bonzini @ 2016-03-21  9:24 UTC (permalink / raw)
  To: linux-kernel, kvm; +Cc: bp

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]

Reported-by: Borislav Petkov <bp@alien8.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 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);
+	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;
@@ -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;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: fix spin_lock_init order on x86
  2016-03-21  9:24 [PATCH] KVM: fix spin_lock_init order on x86 Paolo Bonzini
@ 2016-03-21 14:47 ` Eric Dumazet
  2016-03-21 15:19   ` Paolo Bonzini
  0 siblings, 1 reply; 4+ messages in thread
From: Eric Dumazet @ 2016-03-21 14:47 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, bp

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 <bp@alien8.de>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  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;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: fix spin_lock_init order on x86
  2016-03-21 14:47 ` Eric Dumazet
@ 2016-03-21 15:19   ` Paolo Bonzini
  2016-03-21 17:42     ` Paolo Bonzini
  0 siblings, 1 reply; 4+ messages in thread
From: Paolo Bonzini @ 2016-03-21 15:19 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: linux-kernel, kvm, bp



On 21/03/2016 15:47, Eric Dumazet wrote:
> 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 <bp@alien8.de>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>  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 ?

Indeed, a slightly more complex patch is necessary.  Will try again,
this time not doing this as the first thing in the morning.

Paolo

>> @@ -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;
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] KVM: fix spin_lock_init order on x86
  2016-03-21 15:19   ` Paolo Bonzini
@ 2016-03-21 17:42     ` Paolo Bonzini
  0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2016-03-21 17:42 UTC (permalink / raw)
  To: Eric Dumazet; +Cc: linux-kernel, kvm, bp



On 21/03/2016 16:19, Paolo Bonzini wrote:
>>> >> +	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 ?
> Indeed, a slightly more complex patch is necessary.  Will try again,
> this time not doing this as the first thing in the morning.

And not even _that_ more complex, just a single mmdrop is necessary.
The mmdrop in fact was absent even before the patch, and the patch
actually makes it easier to fix the lack of mmdrop.  Meaning it now
qualifies for stable.

Paolo

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-03-21 17:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-21  9:24 [PATCH] KVM: fix spin_lock_init order on x86 Paolo Bonzini
2016-03-21 14:47 ` Eric Dumazet
2016-03-21 15:19   ` Paolo Bonzini
2016-03-21 17:42     ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).