[PATCH 2/3] KVM: ARM: Fix calculation of virtual CPU ID
Christoffer Dall
christoffer.dall at linaro.org
Thu Sep 26 12:12:45 EDT 2013
On Thu, Sep 26, 2013 at 04:49:27PM +0100, Jonathan Austin wrote:
> KVM does not have a notion of multiple clusters for CPUs, just a linear
> array of CPUs. When using a system with cores in more than one cluster, the
> current method for calculating the virtual MPIDR will leak the (physical)
> cluster information into the virtual MPIDR. One effect of this is that
> Linux under KVM fails to boot multiple CPUs that aren't in the 0th cluster.
>
> This patch does away with exposing the real MPIDR fields in favour of simply
> using the virtual CPU number (but preserving the U bit, as before).
>
> Signed-off-by: Jonathan Austin <jonathan.austin at arm.com>
> Acked-by: Marc Zyngier <marc.zyngier at arm.com>
> ---
> arch/arm/kvm/coproc_a15.c | 11 ++++-------
> 1 file changed, 4 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm/kvm/coproc_a15.c b/arch/arm/kvm/coproc_a15.c
> index cf93472..bbd4b88 100644
> --- a/arch/arm/kvm/coproc_a15.c
> +++ b/arch/arm/kvm/coproc_a15.c
> @@ -27,14 +27,11 @@
> static void reset_mpidr(struct kvm_vcpu *vcpu, const struct coproc_reg *r)
> {
> /*
> - * Compute guest MPIDR:
> - * (Even if we present only one VCPU to the guest on an SMP
> - * host we don't set the U bit in the MPIDR, or vice versa, as
> - * revealing the underlying hardware properties is likely to
> - * be the best choice).
> + * Compute guest MPIDR. No need to mess around with different clusters
> + * but we read the 'U' bit from the underlying hardware directly.
> */
> - vcpu->arch.cp15[c0_MPIDR] = (read_cpuid_mpidr() & ~MPIDR_LEVEL_MASK)
> - | (vcpu->vcpu_id & MPIDR_LEVEL_MASK);
> + vcpu->arch.cp15[c0_MPIDR] = (read_cpuid_mpidr() & MPIDR_SMP_BITMASK)
> + | vcpu->vcpu_id;
> }
>
> #include "coproc.h"
> --
> 1.7.9.5
>
>
Makes sense.
ack.
-Christoffer
More information about the linux-arm-kernel
mailing list