kvm: x86: vmx: NULL out hwapic_isr_update() in case of !enable_apicv
In most cases calling hwapic_isr_update(), we always check if kvm_apic_vid_enabled() == 1, but actually, kvm_apic_vid_enabled() -> kvm_x86_ops->vm_has_apicv() -> vmx_vm_has_apicv() or '0' in svm case -> return enable_apicv && irqchip_in_kernel(kvm) So its a little cost to recall vmx_vm_has_apicv() inside hwapic_isr_update(), here just NULL out hwapic_isr_update() in case of !enable_apicv inside hardware_setup() then make all related stuffs follow this. Note we don't check this under that condition of irqchip_in_kernel() since we should make sure definitely any caller don't work without in-kernel irqchip. Signed-off-by: Tiejun Chen <tiejun.chen@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
5ff22e7ebf
commit
b4eef9b36d
|
@ -402,7 +402,7 @@ static inline void apic_set_isr(int vec, struct kvm_lapic *apic)
|
||||||
* because the processor can modify ISR under the hood. Instead
|
* because the processor can modify ISR under the hood. Instead
|
||||||
* just set SVI.
|
* just set SVI.
|
||||||
*/
|
*/
|
||||||
if (unlikely(kvm_apic_vid_enabled(vcpu->kvm)))
|
if (unlikely(kvm_x86_ops->hwapic_isr_update))
|
||||||
kvm_x86_ops->hwapic_isr_update(vcpu->kvm, vec);
|
kvm_x86_ops->hwapic_isr_update(vcpu->kvm, vec);
|
||||||
else {
|
else {
|
||||||
++apic->isr_count;
|
++apic->isr_count;
|
||||||
|
@ -450,7 +450,7 @@ static inline void apic_clear_isr(int vec, struct kvm_lapic *apic)
|
||||||
* on the other hand isr_count and highest_isr_cache are unused
|
* on the other hand isr_count and highest_isr_cache are unused
|
||||||
* and must be left alone.
|
* and must be left alone.
|
||||||
*/
|
*/
|
||||||
if (unlikely(kvm_apic_vid_enabled(vcpu->kvm)))
|
if (unlikely(kvm_x86_ops->hwapic_isr_update))
|
||||||
kvm_x86_ops->hwapic_isr_update(vcpu->kvm,
|
kvm_x86_ops->hwapic_isr_update(vcpu->kvm,
|
||||||
apic_find_highest_isr(apic));
|
apic_find_highest_isr(apic));
|
||||||
else {
|
else {
|
||||||
|
@ -1742,7 +1742,9 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu,
|
||||||
if (kvm_x86_ops->hwapic_irr_update)
|
if (kvm_x86_ops->hwapic_irr_update)
|
||||||
kvm_x86_ops->hwapic_irr_update(vcpu,
|
kvm_x86_ops->hwapic_irr_update(vcpu,
|
||||||
apic_find_highest_irr(apic));
|
apic_find_highest_irr(apic));
|
||||||
kvm_x86_ops->hwapic_isr_update(vcpu->kvm, apic_find_highest_isr(apic));
|
if (unlikely(kvm_x86_ops->hwapic_isr_update))
|
||||||
|
kvm_x86_ops->hwapic_isr_update(vcpu->kvm,
|
||||||
|
apic_find_highest_isr(apic));
|
||||||
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
||||||
kvm_rtc_eoi_tracking_restore_one(vcpu);
|
kvm_rtc_eoi_tracking_restore_one(vcpu);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5895,6 +5895,7 @@ static __init int hardware_setup(void)
|
||||||
kvm_x86_ops->update_cr8_intercept = NULL;
|
kvm_x86_ops->update_cr8_intercept = NULL;
|
||||||
else {
|
else {
|
||||||
kvm_x86_ops->hwapic_irr_update = NULL;
|
kvm_x86_ops->hwapic_irr_update = NULL;
|
||||||
|
kvm_x86_ops->hwapic_isr_update = NULL;
|
||||||
kvm_x86_ops->deliver_posted_interrupt = NULL;
|
kvm_x86_ops->deliver_posted_interrupt = NULL;
|
||||||
kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy;
|
kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy;
|
||||||
}
|
}
|
||||||
|
@ -7478,9 +7479,6 @@ static void vmx_hwapic_isr_update(struct kvm *kvm, int isr)
|
||||||
u16 status;
|
u16 status;
|
||||||
u8 old;
|
u8 old;
|
||||||
|
|
||||||
if (!vmx_vm_has_apicv(kvm))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (isr == -1)
|
if (isr == -1)
|
||||||
isr = 0;
|
isr = 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue