KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode
authorSean Christopherson <seanjc@google.com>
Fri, 6 Jan 2023 01:12:54 +0000 (01:12 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 13 Jan 2023 15:45:30 +0000 (10:45 -0500)
Disable the optimized APIC logical map 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 map
entries can result in missed IPIs.

Fixes: 1e08ec4a130e ("KVM: optimize apic interrupt delivery")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20230106011306.85230-22-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/lapic.c

index dca87bb6dd1aea1c5b549f04433ea52a45ae0ea3..9c0554bae3b16e54e747f51cb79c9c80ae84998d 100644 (file)
@@ -346,11 +346,12 @@ void kvm_recalculate_apic_map(struct kvm *kvm)
                if (!mask)
                        continue;
 
-               if (!is_power_of_2(mask)) {
+               ldr = ffs(mask) - 1;
+               if (!is_power_of_2(mask) || cluster[ldr]) {
                        new->logical_mode = KVM_APIC_MODE_MAP_DISABLED;
                        continue;
                }
-               cluster[ffs(mask) - 1] = apic;
+               cluster[ldr] = apic;
        }
 out:
        old = rcu_dereference_protected(kvm->arch.apic_map,