• ZhuangYanying's avatar
    KVM: x86: Fix nmi injection failure when vcpu got blocked · 47a66eed
    ZhuangYanying authored
    When spin_lock_irqsave() deadlock occurs inside the guest, vcpu threads,
    other than the lock-holding one, would enter into S state because of
    pvspinlock. Then inject NMI via libvirt API "inject-nmi", the NMI could
    not be injected into vm.
    The reason is:
    1 It sets nmi_queued to 1 when calling ioctl KVM_NMI in qemu, and sets
    cpu->kvm_vcpu_dirty to true in do_inject_external_nmi() meanwhile.
    2 It sets nmi_queued to 0 in process_nmi(), before entering guest, because
    cpu->kvm_vcpu_dirty is true.
    It's not enough just to check nmi_queued to decide whether to stay in
    vcpu_block() or not. NMI should be injected immediately at any situation.
    Add checking nmi_pending, and testing KVM_REQ_NMI replaces nmi_queued
    in vm_vcpu_has_events().
    Do the same change for SMIs.
    Signed-off-by: default avatarZhuang Yanying <ann.zhuangyanying@huawei.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>