Messages in this thread | | | Date | Tue, 13 Sep 2022 18:32:04 -0500 | Subject | Re: [PATCH v2 13/23] KVM: x86: Disable APIC logical map if vCPUs are aliased in logical mode | From | "Suthikulpanit, Suravee" <> |
| |
Hi Sean
On 9/2/2022 7:22 PM, Sean Christopherson wrote: > 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> > --- > arch/x86/kvm/lapic.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > index 6b2f538b8fd0..75748c380ceb 100644 > --- a/arch/x86/kvm/lapic.c > +++ b/arch/x86/kvm/lapic.c > @@ -303,12 +303,13 @@ 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]) {
Should this be checking if the cluster[ldr] is pointing to the same struct apic instead? For example:
if (!is_power_of_2(mask) || cluster[ldr] != apic)
From my observation, the kvm_recalculate_apic_map() can be called many times, and the cluster[ldr] could have already been assigned from the previous invocation. So, as long as it is the same, it should be okay.
Best Regards, Suravee
> new->mode = KVM_APIC_MODE_XAPIC_FLAT | > KVM_APIC_MODE_XAPIC_CLUSTER; > continue; > } > - cluster[ffs(mask) - 1] = apic; > + cluster[ldr] = apic; > } > out: > old = rcu_dereference_protected(kvm->arch.apic_map,
| |