On 6/28/2022 5:55 AM, Maxim Levitsky wrote:
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
Understood. I was about to send v7 to remove this patch from the series, but too late. I'll test the current queue branch and provide update.
Best Regards,
Suravee