• Paolo Bonzini's avatar
    KVM: x86: do not report a vCPU as preempted outside instruction boundaries · 6cd88243
    Paolo Bonzini authored
    If a vCPU is outside guest mode and is scheduled out, it might be in the
    process of making a memory access.  A problem occurs if another vCPU uses
    the PV TLB flush feature during the period when the vCPU is scheduled
    out, and a virtual address has already been translated but has not yet
    been accessed, because this is equivalent to using a stale TLB entry.
    
    To avoid this, only report a vCPU as preempted if sure that the guest
    is at an instruction boundary.  A rescheduling request will be delivered
    to the host physical CPU as an external interrupt, so for simplicity
    consider any vmexit *not* instruction boundary except for external
    interrupts.
    
    It would in principle be okay to report the vCPU as preempted also
    if it is sleeping in kvm_vcpu_block(): a TLB flush IPI will incur the
    vmentry/vmexit overhead unnecessarily, and optimistic spinning is
    also unlikely to succeed.  However, leave it for later because right
    now kvm_vcpu_check_block() is doing memory accesses.  Even
    though the TLB flush issue only applies to virtual memory address,
    it's very much preferrable to be conservative.
    Reported-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    6cd88243
kvm_host.h 60.3 KB