KVM: x86: fix apic_accept_events vs check_nested_events
authorPaolo Bonzini <pbonzini@redhat.com>
Thu, 5 Nov 2020 16:20:49 +0000 (11:20 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Sun, 15 Nov 2020 14:49:08 +0000 (09:49 -0500)
commit1c96dcceaeb3a99aaf0d548eef2223e0b02a7e40
treeab8b7e8b8783bbdea64cc86b53ae50b893baa066
parent7a873e4555679a0e749422db071c142b57f80be9
KVM: x86: fix apic_accept_events vs check_nested_events

vmx_apic_init_signal_blocked is buggy in that it returns true
even in VMX non-root mode.  In non-root mode, however, INITs
are not latched, they just cause a vmexit.  Previously,
KVM was waiting for them to be processed when kvm_apic_accept_events
and in the meanwhile it ate the SIPIs that the processor received.

However, in order to implement the wait-for-SIPI activity state,
KVM will have to process KVM_APIC_SIPI in vmx_check_nested_events,
and it will not be possible anymore to disregard SIPIs in non-root
mode as the code is currently doing.

By calling kvm_x86_ops.nested_ops->check_events, we can force a vmexit
(with the side-effect of latching INITs) before incorrectly injecting
an INIT or SIPI in a guest, and therefore vmx_apic_init_signal_blocked
can do the right thing.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/lapic.c
arch/x86/kvm/vmx/vmx.c