Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1659731 > unrolled thread

[PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage

Started byWanpeng Li <kernellwp@gmail.com>
First post2017-06-07 14:10 +0200
Last post2017-06-08 10:10 +0200
Articles 5 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Wanpeng Li <kernellwp@gmail.com> - 2017-06-07 14:10 +0200
    Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Paolo Bonzini <pbonzini@redhat.com> - 2017-06-07 15:10 +0200
      Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Wanpeng Li <kernellwp@gmail.com> - 2017-06-07 16:20 +0200
        Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Paolo Bonzini <pbonzini@redhat.com> - 2017-06-07 16:30 +0200
          Re: [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage Wanpeng Li <kernellwp@gmail.com> - 2017-06-08 10:10 +0200

#1659731 — [PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage

FromWanpeng Li <kernellwp@gmail.com>
Date2017-06-07 14:10 +0200
Subject[PATCH] KVM: async_pf: Fix rcu_irq_enter/exit() usage
Message-ID<tPHWG-6rv-13@gated-at.bofh.it>
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

[toc] | [next] | [standalone]


#1659778

FromPaolo Bonzini <pbonzini@redhat.com>
Date2017-06-07 15:10 +0200
Message-ID<tPISJ-736-1@gated-at.bofh.it>
In reply to#1659731

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

[toc] | [prev] | [next] | [standalone]


#1659839

FromWanpeng Li <kernellwp@gmail.com>
Date2017-06-07 16:20 +0200
Message-ID<tPJYt-7IG-9@gated-at.bofh.it>
In reply to#1659778
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

[toc] | [prev] | [next] | [standalone]


#1659849

FromPaolo Bonzini <pbonzini@redhat.com>
Date2017-06-07 16:30 +0200
Message-ID<tPK89-7Mn-13@gated-at.bofh.it>
In reply to#1659839

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

[toc] | [prev] | [next] | [standalone]


#1660907

FromWanpeng Li <kernellwp@gmail.com>
Date2017-06-08 10:10 +0200
Message-ID<tQ0FY-1HV-21@gated-at.bofh.it>
In reply to#1659849
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

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web