• Vitaly Kuznetsov's avatar
    KVM: x86: Wait for IPIs to be delivered when handling Hyper-V TLB flush hypercall · 1ebfaa11
    Vitaly Kuznetsov authored
    Prior to commit 0baedd79 ("KVM: x86: make Hyper-V PV TLB flush use
    tlb_flush_guest()"), kvm_hv_flush_tlb() was using 'KVM_REQ_TLB_FLUSH |
    KVM_REQUEST_NO_WAKEUP' when making a request to flush TLBs on other vCPUs
    and KVM_REQ_TLB_FLUSH is/was defined as:
    
     (0 | KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP)
    
    so KVM_REQUEST_WAIT was lost. Hyper-V TLFS, however, requires that
    "This call guarantees that by the time control returns back to the
    caller, the observable effects of all flushes on the specified virtual
    processors have occurred." and without KVM_REQUEST_WAIT there's a small
    chance that the vCPU making the TLB flush will resume running before
    all IPIs get delivered to other vCPUs and a stale mapping can get read
    there.
    
    Fix the issue by adding KVM_REQUEST_WAIT flag to KVM_REQ_TLB_FLUSH_GUEST:
    kvm_hv_flush_tlb() is the sole caller which uses it for
    kvm_make_all_cpus_request()/kvm_make_vcpus_request_mask() where
    KVM_REQUEST_WAIT makes a difference.
    
    Cc: stable@kernel.org
    Fixes: 0baedd79 ("KVM: x86: make Hyper-V PV TLB flush use tlb_flush_guest()")
    Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Message-Id: <20211209102937.584397-1-vkuznets@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    1ebfaa11
kvm_host.h 58.7 KB