From: Wanpeng Li <[email protected]>

When SMP VM start, AP may lost INIT because of receiving INIT between
kvm_vcpu_ioctl_x86_get/set_vcpu_events.

       vcpu 0                             vcpu 1
                                   kvm_vcpu_ioctl_x86_get_vcpu_events
                                     events->smi.latched_init = 0
  send INIT to vcpu1
    set vcpu1's pending_events
                                   kvm_vcpu_ioctl_x86_set_vcpu_events
                                      if (events->smi.latched_init == 0)
                                        clear INIT in pending_events

This patch fixes it by just update SMM related flags if we are in SMM.

Thanks Peng Hao for the report and original commit message.

Reported-by: Peng Hao <[email protected]>
Cc: Paolo Bonzini <[email protected]>
Cc: Radim Krčmář <[email protected]>
Signed-off-by: Wanpeng Li <[email protected]>
---
v1 -> v2:
 * move the stuff under if (events->smi_smm)

 arch/x86/kvm/x86.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 1a4c84d..839b5dad6 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3160,15 +3160,18 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct 
kvm_vcpu *vcpu,
                kvm_set_hflags(vcpu, hflags);
 
                vcpu->arch.smi_pending = events->smi.pending;
-               if (events->smi.smm_inside_nmi)
-                       vcpu->arch.hflags |= HF_SMM_INSIDE_NMI_MASK;
-               else
-                       vcpu->arch.hflags &= ~HF_SMM_INSIDE_NMI_MASK;
-               if (lapic_in_kernel(vcpu)) {
-                       if (events->smi.latched_init)
-                               set_bit(KVM_APIC_INIT, 
&vcpu->arch.apic->pending_events);
+
+               if (events->smi.smm) {
+                       if (events->smi.smm_inside_nmi)
+                               vcpu->arch.hflags |= HF_SMM_INSIDE_NMI_MASK;
                        else
-                               clear_bit(KVM_APIC_INIT, 
&vcpu->arch.apic->pending_events);
+                               vcpu->arch.hflags &= ~HF_SMM_INSIDE_NMI_MASK;
+                       if (lapic_in_kernel(vcpu)) {
+                               if (events->smi.latched_init)
+                                       set_bit(KVM_APIC_INIT, 
&vcpu->arch.apic->pending_events);
+                               else
+                                       clear_bit(KVM_APIC_INIT, 
&vcpu->arch.apic->pending_events);
+                       }
                }
        }
 
-- 
2.7.4

Reply via email to