KVM: SVM: Inhibit AVIC if vCPUs are aliased in logical mode
Inhibit SVM's AVIC if multiple vCPUs are aliased to the same logical ID. Architecturally, all CPUs whose logical ID matches the MDA are supposed to receive the interrupt; overwriting existing entries in AVIC's logical=>physical map can result in missed IPIs. Fixes: 18f40c53e10f ("svm: Add VMEXIT handlers for AVIC") Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20230106011306.85230-25-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
5063c41beb
commit
9a364857ab
arch/x86
@ -1218,6 +1218,12 @@ enum kvm_apicv_inhibit {
|
||||
* AVIC is disabled because SEV doesn't support it.
|
||||
*/
|
||||
APICV_INHIBIT_REASON_SEV,
|
||||
|
||||
/*
|
||||
* AVIC is disabled because not all vCPUs with a valid LDR have a 1:1
|
||||
* mapping between logical ID and vCPU.
|
||||
*/
|
||||
APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED,
|
||||
};
|
||||
|
||||
struct kvm_arch {
|
||||
|
@ -396,6 +396,11 @@ out:
|
||||
else
|
||||
kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED);
|
||||
|
||||
if (!new || new->logical_mode == KVM_APIC_MODE_MAP_DISABLED)
|
||||
kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
|
||||
else
|
||||
kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
|
||||
|
||||
old = rcu_dereference_protected(kvm->arch.apic_map,
|
||||
lockdep_is_held(&kvm->arch.apic_map_lock));
|
||||
rcu_assign_pointer(kvm->arch.apic_map, new);
|
||||
|
@ -967,7 +967,8 @@ bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason)
|
||||
BIT(APICV_INHIBIT_REASON_SEV) |
|
||||
BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) |
|
||||
BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) |
|
||||
BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED);
|
||||
BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) |
|
||||
BIT(APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
|
||||
|
||||
return supported & BIT(reason);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user