|
@@ -4367,6 +4367,18 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static inline bool kvm_vcpu_trigger_posted_interrupt(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ if (vcpu->mode == IN_GUEST_MODE) {
|
|
|
+ apic->send_IPI_mask(get_cpu_mask(vcpu->cpu),
|
|
|
+ POSTED_INTR_VECTOR);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu,
|
|
|
int vector)
|
|
|
{
|
|
@@ -4375,9 +4387,7 @@ static int vmx_deliver_nested_posted_interrupt(struct kvm_vcpu *vcpu,
|
|
|
if (is_guest_mode(vcpu) &&
|
|
|
vector == vmx->nested.posted_intr_nv) {
|
|
|
/* the PIR and ON have been set by L1. */
|
|
|
- if (vcpu->mode == IN_GUEST_MODE)
|
|
|
- apic->send_IPI_mask(get_cpu_mask(vcpu->cpu),
|
|
|
- POSTED_INTR_VECTOR);
|
|
|
+ kvm_vcpu_trigger_posted_interrupt(vcpu);
|
|
|
/*
|
|
|
* If a posted intr is not recognized by hardware,
|
|
|
* we will accomplish it in the next vmentry.
|
|
@@ -4409,12 +4419,7 @@ static void vmx_deliver_posted_interrupt(struct kvm_vcpu *vcpu, int vector)
|
|
|
|
|
|
r = pi_test_and_set_on(&vmx->pi_desc);
|
|
|
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
|
|
-#ifdef CONFIG_SMP
|
|
|
- if (!r && (vcpu->mode == IN_GUEST_MODE))
|
|
|
- apic->send_IPI_mask(get_cpu_mask(vcpu->cpu),
|
|
|
- POSTED_INTR_VECTOR);
|
|
|
- else
|
|
|
-#endif
|
|
|
+ if (r || !kvm_vcpu_trigger_posted_interrupt(vcpu))
|
|
|
kvm_vcpu_kick(vcpu);
|
|
|
}
|
|
|
|