Skip to content

Commit 87a6c03

Browse files
committed
KVM: SVM: Inhibit AVIC if vCPUs are aliased in logical mode
jira LE-1907 Rebuild_History Non-Buildable kernel-5.14.0-284.30.1.el9_2 commit-author Sean Christopherson <seanjc@google.com> commit 9a36485 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: 18f40c5 ("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> (cherry picked from commit 9a36485) Signed-off-by: Jonathan Maple <jmaple@ciq.com>
1 parent b553561 commit 87a6c03

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
lines changed

arch/x86/include/asm/kvm_host.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,12 @@ enum kvm_apicv_inhibit {
11511151
* AVIC is disabled because SEV doesn't support it.
11521152
*/
11531153
APICV_INHIBIT_REASON_SEV,
1154+
1155+
/*
1156+
* AVIC is disabled because not all vCPUs with a valid LDR have a 1:1
1157+
* mapping between logical ID and vCPU.
1158+
*/
1159+
APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED,
11541160
};
11551161

11561162
struct kvm_arch {

arch/x86/kvm/lapic.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
397397
else
398398
kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED);
399399

400+
if (!new || new->logical_mode == KVM_APIC_MODE_MAP_DISABLED)
401+
kvm_set_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
402+
else
403+
kvm_clear_apicv_inhibit(kvm, APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
404+
400405
old = rcu_dereference_protected(kvm->arch.apic_map,
401406
lockdep_is_held(&kvm->arch.apic_map_lock));
402407
rcu_assign_pointer(kvm->arch.apic_map, new);

arch/x86/kvm/svm/avic.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -967,7 +967,8 @@ bool avic_check_apicv_inhibit_reasons(enum kvm_apicv_inhibit reason)
967967
BIT(APICV_INHIBIT_REASON_SEV) |
968968
BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) |
969969
BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) |
970-
BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED);
970+
BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED) |
971+
BIT(APICV_INHIBIT_REASON_LOGICAL_ID_ALIASED);
971972

972973
return supported & BIT(reason);
973974
}

0 commit comments

Comments
 (0)