KVM: arm64: Fast-track kvm_mpidr_to_vcpu() when mpidr_data is available
authorMarc Zyngier <maz@kernel.org>
Wed, 27 Sep 2023 09:09:09 +0000 (10:09 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Sat, 30 Sep 2023 18:15:44 +0000 (18:15 +0000)
If our fancy little table is present when calling kvm_mpidr_to_vcpu(),
use it to recover the corresponding vcpu.

Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Reviewed-by: Zenghui Yu <yuzenghui@huawei.com>
Tested-by: Joey Gouly <joey.gouly@arm.com>
Tested-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230927090911.3355209-10-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/arm.c

index b02e28f760839c0d6c5a9c9b45d96f0bba4a7ffc..e3d667feecaf6d64e79dff63d502c79d20d23797 100644 (file)
@@ -2388,6 +2388,18 @@ struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr)
        unsigned long i;
 
        mpidr &= MPIDR_HWID_BITMASK;
+
+       if (kvm->arch.mpidr_data) {
+               u16 idx = kvm_mpidr_index(kvm->arch.mpidr_data, mpidr);
+
+               vcpu = kvm_get_vcpu(kvm,
+                                   kvm->arch.mpidr_data->cmpidr_to_idx[idx]);
+               if (mpidr != kvm_vcpu_get_mpidr_aff(vcpu))
+                       vcpu = NULL;
+
+               return vcpu;
+       }
+
        kvm_for_each_vcpu(i, vcpu, kvm) {
                if (mpidr == kvm_vcpu_get_mpidr_aff(vcpu))
                        return vcpu;