• Sean Christopherson's avatar
    KVM: VMX: Wake vCPU when delivering posted IRQ even if vCPU == this vCPU · fdba608f
    Sean Christopherson authored
    Drop a check that guards triggering a posted interrupt on the currently
    running vCPU, and more importantly guards waking the target vCPU if
    triggering a posted interrupt fails because the vCPU isn't IN_GUEST_MODE.
    If a vIRQ is delivered from asynchronous context, the target vCPU can be
    the currently running vCPU and can also be blocking, in which case
    skipping kvm_vcpu_wake_up() is effectively dropping what is supposed to
    be a wake event for the vCPU.
    
    The "do nothing" logic when "vcpu == running_vcpu" mostly works only
    because the majority of calls to ->deliver_posted_interrupt(), especially
    when using posted interrupts, come from synchronous KVM context.  But if
    a device is exposed to the guest using vfio-pci passthrough, the VFIO IRQ
    and vCPU are bound to the same pCPU, and the IRQ is _not_ configured to
    use posted interrupts, wake events from the device will be delivered to
    KVM from IRQ context, e.g.
    
      vfio_msihandler()
      |
      |-> eventfd_signal()
          |
          |-> ...
              |
              |->  irqfd_wakeup()
                   |
                   |->kvm_arch_set_irq_inatomic()
                      |
                      |-> kvm_irq_delivery_to_apic_fast()
                          |
                          |-> kvm_apic_set_irq()
    
    This also aligns the non-nested and nested usage of triggering posted
    interrupts, and will allow for additional cleanups.
    
    Fixes: 379a3c8e ("KVM: VMX: Optimize posted-interrupt delivery for timer fastpath")
    Cc: stable@vger.kernel.org
    Reported-by: default avatarLongpeng (Mike) <longpeng2@huawei.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
    Message-Id: <20211208015236.1616697-18-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    fdba608f
vmx.c 225 KB