|
@@ -6649,8 +6649,10 @@ static __init int hardware_setup(void)
|
|
|
if (!cpu_has_vmx_ple())
|
|
|
ple_gap = 0;
|
|
|
|
|
|
- if (!cpu_has_vmx_apicv())
|
|
|
+ if (!cpu_has_vmx_apicv()) {
|
|
|
enable_apicv = 0;
|
|
|
+ kvm_x86_ops->sync_pir_to_irr = NULL;
|
|
|
+ }
|
|
|
|
|
|
if (cpu_has_vmx_tsc_scaling()) {
|
|
|
kvm_has_tsc_control = true;
|
|
@@ -8722,20 +8724,25 @@ static void vmx_hwapic_irr_update(struct kvm_vcpu *vcpu, int max_irr)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void vmx_sync_pir_to_irr(struct kvm_vcpu *vcpu)
|
|
|
+static int vmx_sync_pir_to_irr(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
|
+ int max_irr;
|
|
|
|
|
|
- if (!pi_test_on(&vmx->pi_desc))
|
|
|
- return;
|
|
|
-
|
|
|
- pi_clear_on(&vmx->pi_desc);
|
|
|
- /*
|
|
|
- * IOMMU can write to PIR.ON, so the barrier matters even on UP.
|
|
|
- * But on x86 this is just a compiler barrier anyway.
|
|
|
- */
|
|
|
- smp_mb__after_atomic();
|
|
|
- kvm_apic_update_irr(vcpu, vmx->pi_desc.pir);
|
|
|
+ WARN_ON(!vcpu->arch.apicv_active);
|
|
|
+ if (pi_test_on(&vmx->pi_desc)) {
|
|
|
+ pi_clear_on(&vmx->pi_desc);
|
|
|
+ /*
|
|
|
+ * IOMMU can write to PIR.ON, so the barrier matters even on UP.
|
|
|
+ * But on x86 this is just a compiler barrier anyway.
|
|
|
+ */
|
|
|
+ smp_mb__after_atomic();
|
|
|
+ max_irr = kvm_apic_update_irr(vcpu, vmx->pi_desc.pir);
|
|
|
+ } else {
|
|
|
+ max_irr = kvm_lapic_find_highest_irr(vcpu);
|
|
|
+ }
|
|
|
+ vmx_hwapic_irr_update(vcpu, max_irr);
|
|
|
+ return max_irr;
|
|
|
}
|
|
|
|
|
|
static void vmx_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)
|