KVM: SVM: avoid refreshing avic if its state didn't change
Since AVIC can be inhibited and uninhibited rapidly it is possible that we have nothing to do by the time the svm_refresh_apicv_exec_ctrl is called. Detect and avoid this, which will be useful when we will start calling avic_vcpu_load/avic_vcpu_put when the avic inhibition state changes. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20210810205251.424103-14-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
30eed56a7e
commit
06ef813466
@@ -9239,12 +9239,18 @@ void kvm_make_scan_ioapic_request(struct kvm *kvm)
|
|||||||
|
|
||||||
void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu)
|
void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
|
bool activate;
|
||||||
|
|
||||||
if (!lapic_in_kernel(vcpu))
|
if (!lapic_in_kernel(vcpu))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&vcpu->kvm->arch.apicv_update_lock);
|
mutex_lock(&vcpu->kvm->arch.apicv_update_lock);
|
||||||
|
|
||||||
vcpu->arch.apicv_active = kvm_apicv_activated(vcpu->kvm);
|
activate = kvm_apicv_activated(vcpu->kvm);
|
||||||
|
if (vcpu->arch.apicv_active == activate)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
vcpu->arch.apicv_active = activate;
|
||||||
kvm_apic_update_apicv(vcpu);
|
kvm_apic_update_apicv(vcpu);
|
||||||
static_call(kvm_x86_refresh_apicv_exec_ctrl)(vcpu);
|
static_call(kvm_x86_refresh_apicv_exec_ctrl)(vcpu);
|
||||||
|
|
||||||
@@ -9257,6 +9263,7 @@ void kvm_vcpu_update_apicv(struct kvm_vcpu *vcpu)
|
|||||||
if (!vcpu->arch.apicv_active)
|
if (!vcpu->arch.apicv_active)
|
||||||
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
kvm_make_request(KVM_REQ_EVENT, vcpu);
|
||||||
|
|
||||||
|
out:
|
||||||
mutex_unlock(&vcpu->kvm->arch.apicv_update_lock);
|
mutex_unlock(&vcpu->kvm->arch.apicv_update_lock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvm_vcpu_update_apicv);
|
EXPORT_SYMBOL_GPL(kvm_vcpu_update_apicv);
|
||||||
|
|||||||
Reference in New Issue
Block a user