KVM: VMX: Do not fully reset PI descriptor on vCPU reset
authorJan H. Schönherr <jschoenh@amazon.de>
Wed, 25 Oct 2017 14:43:26 +0000 (16:43 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 2 Nov 2017 17:27:11 +0000 (18:27 +0100)
Parts of the posted interrupt descriptor configure host behavior,
such as the notification vector and destination. Overwriting them
with zero as done during vCPU reset breaks posted interrupts.
KVM (re-)writes these fields on certain occasions and belatedly fixes
the situation in many cases. However, if you have a guest configured
with "idle=poll", for example, the fields might stay zero forever.

Do not reset the full descriptor in vmx_vcpu_reset(). Instead,
reset only the outstanding notifications and leave everything
else untouched.

Signed-off-by: Jan H. Schönherr <jschoenh@amazon.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index 95a01609d7eea13633a6d53383a6e2859463c3e5..e0b4b64f211adbcb587f61248cdca010373acc59 100644 (file)
@@ -5619,8 +5619,10 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
 
        kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu);
 
 
        kvm_make_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu);
 
-       if (kvm_vcpu_apicv_active(vcpu))
-               memset(&vmx->pi_desc, 0, sizeof(struct pi_desc));
+       if (kvm_vcpu_apicv_active(vcpu)) {
+               pi_clear_on(&vmx->pi_desc);
+               memset(vmx->pi_desc.pir, 0, sizeof(vmx->pi_desc.pir));
+       }
 
        if (vmx->vpid != 0)
                vmcs_write16(VIRTUAL_PROCESSOR_ID, vmx->vpid);
 
        if (vmx->vpid != 0)
                vmcs_write16(VIRTUAL_PROCESSOR_ID, vmx->vpid);