linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
@ 2017-06-07 12:04 Wanpeng Li
  2017-06-07 13:05 ` Paolo Bonzini
  0 siblings, 1 reply; 5+ messages in thread
From: Wanpeng Li @ 2017-06-07 12:04 UTC (permalink / raw)
  To: linux-kernel, kvm; +Cc: Paolo Bonzini, Radim Krčmář, Wanpeng Li

From: Wanpeng Li <wanpeng.li@hotmail.com>

Commit 9b132fbe5419 (Add rcu user eqs exception hooks for async page fault) 
adds rcu_irq_enter/exit() to kvm_async_pf_task_wait() to exit cpu idle eqs 
when needed, to protect the code that needs use rcu. There is no need to call 
this pairs if async page fault is not triggered from idle task.

This patch fixes it by rcu irq exit if it is not triggered from idle task to 
avoid rcu hang after schedule() in the for loop.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
---
 arch/x86/kernel/kvm.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 43e10d6..e70ed72 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -141,6 +141,8 @@ void kvm_async_pf_task_wait(u32 token)
 	n.token = token;
 	n.cpu = smp_processor_id();
 	n.halted = is_idle_task(current) || preempt_count() > 1;
+	if (!n.halted)
+		rcu_irq_exit();
 	init_swait_queue_head(&n.wq);
 	hlist_add_head(&n.link, &b->list);
 	raw_spin_unlock(&b->lock);
@@ -167,8 +169,9 @@ void kvm_async_pf_task_wait(u32 token)
 	}
 	if (!n.halted)
 		finish_swait(&n.wq, &wait);
+	else
+		rcu_irq_exit();
 
-	rcu_irq_exit();
 	return;
 }
 EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);
-- 
2.7.4

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

* Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
  2017-06-07 12:04 [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Wanpeng Li
@ 2017-06-07 13:05 ` Paolo Bonzini
  2017-06-07 14:10   ` Wanpeng Li
  0 siblings, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2017-06-07 13:05 UTC (permalink / raw)
  To: Wanpeng Li, linux-kernel, kvm; +Cc: Radim Krčmář, Wanpeng Li



On 07/06/2017 14:04, Wanpeng Li wrote:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
> 
> Commit 9b132fbe5419 (Add rcu user eqs exception hooks for async page fault) 
> adds rcu_irq_enter/exit() to kvm_async_pf_task_wait() to exit cpu idle eqs 
> when needed, to protect the code that needs use rcu. There is no need to call 
> this pairs if async page fault is not triggered from idle task.
> 
> This patch fixes it by rcu irq exit if it is not triggered from idle task to 
> avoid rcu hang after schedule() in the for loop.

How does the bug manifest?

Paolo

> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
>  arch/x86/kernel/kvm.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index 43e10d6..e70ed72 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -141,6 +141,8 @@ void kvm_async_pf_task_wait(u32 token)
>  	n.token = token;
>  	n.cpu = smp_processor_id();
>  	n.halted = is_idle_task(current) || preempt_count() > 1;
> +	if (!n.halted)
> +		rcu_irq_exit();
>  	init_swait_queue_head(&n.wq);
>  	hlist_add_head(&n.link, &b->list);
>  	raw_spin_unlock(&b->lock);
> @@ -167,8 +169,9 @@ void kvm_async_pf_task_wait(u32 token)
>  	}
>  	if (!n.halted)
>  		finish_swait(&n.wq, &wait);
> +	else
> +		rcu_irq_exit();
>  
> -	rcu_irq_exit();
>  	return;
>  }

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

* Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
  2017-06-07 13:05 ` Paolo Bonzini
@ 2017-06-07 14:10   ` Wanpeng Li
  2017-06-07 14:24     ` Paolo Bonzini
  0 siblings, 1 reply; 5+ messages in thread
From: Wanpeng Li @ 2017-06-07 14:10 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-06-07 21:05 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
> On 07/06/2017 14:04, Wanpeng Li wrote:
>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>
>> Commit 9b132fbe5419 (Add rcu user eqs exception hooks for async page fault)
>> adds rcu_irq_enter/exit() to kvm_async_pf_task_wait() to exit cpu idle eqs
>> when needed, to protect the code that needs use rcu. There is no need to call
>> this pairs if async page fault is not triggered from idle task.
>>
>> This patch fixes it by rcu irq exit if it is not triggered from idle task to
>> avoid rcu hang after schedule() in the for loop.
>
> How does the bug manifest?

Just by codes review.

Regards,
Wanpeng Li

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

* Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
  2017-06-07 14:10   ` Wanpeng Li
@ 2017-06-07 14:24     ` Paolo Bonzini
  2017-06-08  8:00       ` Wanpeng Li
  0 siblings, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2017-06-07 14:24 UTC (permalink / raw)
  To: Wanpeng Li; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li



On 07/06/2017 16:10, Wanpeng Li wrote:
> 2017-06-07 21:05 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>
>>
>> On 07/06/2017 14:04, Wanpeng Li wrote:
>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>
>>> Commit 9b132fbe5419 (Add rcu user eqs exception hooks for async page fault)
>>> adds rcu_irq_enter/exit() to kvm_async_pf_task_wait() to exit cpu idle eqs
>>> when needed, to protect the code that needs use rcu. There is no need to call
>>> this pairs if async page fault is not triggered from idle task.
>>>
>>> This patch fixes it by rcu irq exit if it is not triggered from idle task to
>>> avoid rcu hang after schedule() in the for loop.
>>
>> How does the bug manifest?
> 
> Just by codes review.

So it's just code cleanup?

Paolo

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

* Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
  2017-06-07 14:24     ` Paolo Bonzini
@ 2017-06-08  8:00       ` Wanpeng Li
  0 siblings, 0 replies; 5+ messages in thread
From: Wanpeng Li @ 2017-06-08  8:00 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: linux-kernel, kvm, Radim Krčmář, Wanpeng Li

2017-06-07 22:24 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>
>
> On 07/06/2017 16:10, Wanpeng Li wrote:
>> 2017-06-07 21:05 GMT+08:00 Paolo Bonzini <pbonzini@redhat.com>:
>>>
>>>
>>> On 07/06/2017 14:04, Wanpeng Li wrote:
>>>> From: Wanpeng Li <wanpeng.li@hotmail.com>
>>>>
>>>> Commit 9b132fbe5419 (Add rcu user eqs exception hooks for async page fault)
>>>> adds rcu_irq_enter/exit() to kvm_async_pf_task_wait() to exit cpu idle eqs
>>>> when needed, to protect the code that needs use rcu. There is no need to call
>>>> this pairs if async page fault is not triggered from idle task.
>>>>
>>>> This patch fixes it by rcu irq exit if it is not triggered from idle task to
>>>> avoid rcu hang after schedule() in the for loop.
>>>
>>> How does the bug manifest?
>>
>> Just by codes review.
>
> So it's just code cleanup?

Yeah, this should be a cleanup and I will update the patch
description. Actually, I observe a hang due to async pf injected to L2
which should be injected to L1, then tasks hang in L1 due to missing
PAGE_READY async_pfs.

Regards,
Wanpeng Li

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

end of thread, other threads:[~2017-06-08  8:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-07 12:04 [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Wanpeng Li
2017-06-07 13:05 ` Paolo Bonzini
2017-06-07 14:10   ` Wanpeng Li
2017-06-07 14:24     ` Paolo Bonzini
2017-06-08  8:00       ` Wanpeng Li

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).