Re: [PATCH v6 15/17] KVM: SVM: Use target APIC ID to complete x2AVIC IRQs when possible

From: Maxim Levitsky
Date: Mon Jun 27 2022 - 18:55:35 EST


On Fri, 2022-06-24 at 18:41 +0200, Paolo Bonzini wrote:
> On 5/19/22 12:27, Suravee Suthikulpanit wrote:
> > + * If the x2APIC logical ID sub-field (i.e. icrh[15:0]) contains zero
> > + * or more than 1 bits, we cannot match just one vcpu to kick for
> > + * fast path.
> > + */
> > + if (!first || (first != last))
> > + return -EINVAL;
> > +
> > + apic = first - 1;
> > + if ((apic < 0) || (apic > 15) || (cluster >= 0xfffff))
> > + return -EINVAL;
>
> Neither of these is possible: first == 0 has been cheked above, and
> ffs(icrh & 0xffff) cannot exceed 15. Likewise, cluster is actually
> limited to 16 bits, not 20.
>
> Plus, C is not Pascal so no parentheses. :)
>
> Putting everything together, it can be simplified to this:
>
> + int cluster = (icrh & 0xffff0000) >> 16;
> + int apic = ffs(icrh & 0xffff) - 1;
> +
> + /*
> + * If the x2APIC logical ID sub-field (i.e. icrh[15:0])
> + * contains anything but a single bit, we cannot use the
> + * fast path, because it is limited to a single vCPU.
> + */
> + if (apic < 0 || icrh != (1 << apic))
> + return -EINVAL;
> +
> + l1_physical_id = (cluster << 4) + apic;
>
>
> > + apic_id = (cluster << 4) + apic;

Hi Paolo and Suravee Suthikulpanit!

Note that this patch is not needed anymore, I fixed the avic_kick_target_vcpus_fast function,
and added the support for x2apic because it was very easy to do
(I already needed to parse logical id for flat and cluser modes)

Best regards,
Maxim Levitsky