KVM: arm64: Convert kvm_mpidr_index() to bitmap_gather()
authorMarc Zyngier <maz@kernel.org>
Thu, 2 May 2024 15:42:47 +0000 (16:42 +0100)
committerMarc Zyngier <maz@kernel.org>
Fri, 3 May 2024 10:34:51 +0000 (11:34 +0100)
Linux 6.9 has introduced new bitmap manipulation helpers, with
bitmap_gather() being of special interest, as it does exactly
what kvm_mpidr_index() is already doing.

Make the latter a wrapper around the former.

Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20240502154247.3012042-1-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h

index 9e8a496fb284ea3aff570950fc2b3e15b5e4e586..403d7479c0bc86e9ff71601dd0ea759e5ebec4b6 100644 (file)
@@ -220,20 +220,10 @@ struct kvm_mpidr_data {
 
 static inline u16 kvm_mpidr_index(struct kvm_mpidr_data *data, u64 mpidr)
 {
-       unsigned long mask = data->mpidr_mask;
-       u64 aff = mpidr & MPIDR_HWID_BITMASK;
-       int nbits, bit, bit_idx = 0;
-       u16 index = 0;
+       unsigned long index = 0, mask = data->mpidr_mask;
+       unsigned long aff = mpidr & MPIDR_HWID_BITMASK;
 
-       /*
-        * If this looks like RISC-V's BEXT or x86's PEXT
-        * instructions, it isn't by accident.
-        */
-       nbits = fls(mask);
-       for_each_set_bit(bit, &mask, nbits) {
-               index |= (aff & BIT(bit)) >> (bit - bit_idx);
-               bit_idx++;
-       }
+       bitmap_gather(&index, &aff, &mask, fls(mask));
 
        return index;
 }