On 01/08/2017 13:13, Wanpeng Li wrote: > 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? If it works, it's perfect. :) Please add Cc for stable kernels too in v4. Paolo > 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 >