Drop the duplicate calculation of the logical "index", which ends up being the same for x2APIC vs. xAPIC: cluster + bit number. Note, the existing code is a mess and uses ffs(), which is 1-based, and __ffs(), which is 0-based, for the exact same calculation, i.e. replacing "ffs(bitmap) - 1" with "__ffs(bitmap)" is intentional. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> --- arch/x86/kvm/svm/avic.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index 8c9cad96008e..05a1cde8175c 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -407,12 +407,14 @@ static int avic_kick_target_vcpus_fast(struct kvm *kvm, struct kvm_lapic *source AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; } else { /* - * For x2APIC logical mode, cannot leverage the index. - * Instead, calculate physical ID from logical ID in ICRH. + * For x2APIC, the logical APIC ID is a read-only value + * that is derived from the x2APIC ID, thus the x2APIC + * ID can be found by reversing the calculation (done + * above). Note, bits 31:20 of the x2APIC ID are not + * propagated to the logical ID, but KVM limits the + * x2APIC ID limited to KVM_MAX_VCPU_IDS. */ - int apic = ffs(bitmap) - 1; - - l1_physical_id = cluster + apic; + l1_physical_id = logid_index; } } -- 2.37.2.672.g94769d06f0-goog