diff options
Diffstat (limited to 'arch/x86/kvm/lapic.c')
| -rw-r--r-- | arch/x86/kvm/lapic.c | 9 | 
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e1adbb4aca75..0eee2c8b64d1 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1861,11 +1861,14 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)  {  	struct kvm_lapic *apic = vcpu->arch.apic;  	unsigned int sipi_vector; +	unsigned long pe; -	if (!kvm_vcpu_has_lapic(vcpu)) +	if (!kvm_vcpu_has_lapic(vcpu) || !apic->pending_events)  		return; -	if (test_and_clear_bit(KVM_APIC_INIT, &apic->pending_events)) { +	pe = xchg(&apic->pending_events, 0); + +	if (test_bit(KVM_APIC_INIT, &pe)) {  		kvm_lapic_reset(vcpu);  		kvm_vcpu_reset(vcpu);  		if (kvm_vcpu_is_bsp(apic->vcpu)) @@ -1873,7 +1876,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)  		else  			vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED;  	} -	if (test_and_clear_bit(KVM_APIC_SIPI, &apic->pending_events) && +	if (test_bit(KVM_APIC_SIPI, &pe) &&  	    vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) {  		/* evaluate pending_events before reading the vector */  		smp_rmb();  |