2017-08-01 18:37 GMT+08:00 Paolo Bonzini <pbonzini@xxxxxxxxxx>: > On 27/07/2017 11:05, Wanpeng Li wrote: >> 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 is true, but I think the patch is making things more complex where > it could be simplifying them. Right now, the "native_safe_halt" branch > is calling rcu_irq_exit/enter but the "schedule" branch is not. Could > you just pull rcu_irq_exit/enter outside the "if", so that you inform > the RCU subsystem even in the !n.halted case? How about something like this? diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 71c17a5..d04e30e 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -151,6 +151,8 @@ void kvm_async_pf_task_wait(u32 token) if (hlist_unhashed(&n.link)) break; + rcu_irq_exit(); + if (!n.halted) { local_irq_enable(); schedule(); @@ -159,11 +161,11 @@ void kvm_async_pf_task_wait(u32 token) /* * We cannot reschedule. So halt. */ - rcu_irq_exit(); native_safe_halt(); local_irq_disable(); - rcu_irq_enter(); } + + rcu_irq_enter(); } if (!n.halted) finish_swait(&n.wq, &wait); Regards, Wanpeng Li