• Li Zhong's avatar
    Add rcu user eqs exception hooks for async page fault · 9b132fbe
    Li Zhong authored
    This patch adds user eqs exception hooks for async page fault page not
    present code path, to exit the user eqs and re-enter it as necessary.
    
    Async page fault is different from other exceptions that it may be
    triggered from idle process, so we still need rcu_irq_enter() and
    rcu_irq_exit() to exit cpu idle eqs when needed, to protect the code
    that needs use rcu.
    
    As Frederic pointed out it would be safest and simplest to protect the
    whole kvm_async_pf_task_wait(). Otherwise, "we need to check all the
    code there deeply for potential RCU uses and ensure it will never be
    extended later to use RCU.".
    
    However, We'd better re-enter the cpu idle eqs if we get the exception
    in cpu idle eqs, by calling rcu_irq_exit() before native_safe_halt().
    
    So the patch does what Frederic suggested for rcu_irq_*() API usage
    here, except that I moved the rcu_irq_*() pair originally in
    do_async_page_fault() into kvm_async_pf_task_wait().
    
    That's because, I think it's better to have rcu_irq_*() pairs to be in
    one function ( rcu_irq_exit() after rcu_irq_enter() ), especially here,
    kvm_async_pf_task_wait() has other callers, which might cause
    rcu_irq_exit() be called without a matching rcu_irq_enter() before it,
    which is illegal if the cpu happens to be in rcu idle state.
    Signed-off-by: default avatarLi Zhong <zhong@linux.vnet.ibm.com>
    Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
    9b132fbe
kvm.c 11.6 KB