* [Qemu-devel] [PATCH 0/2] Enable QEMU to control MPIDR values @ 2017-02-27 17:37 Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 1/2] HACK: update linux/kvm header Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can Andrew Jones 0 siblings, 2 replies; 5+ messages in thread From: Andrew Jones @ 2017-02-27 17:37 UTC (permalink / raw) To: qemu-devel, qemu-arm Cc: peter.maydell, christoffer.dall, marc.zyngier, imammedo Igor needs to know/select vcpu MPIDR values early in order to map vcpus to vnodes. Waiting until after vcpu init, when KVM sets them, is too late. With this patch, and its KVM counterpart, QEMU can control the values, allowing it to know/select them whenever it likes. Andrew Jones (2): HACK: update linux/kvm header arm: kvm: set MPIDR when we can linux-headers/linux/kvm.h | 1 + target/arm/cpu.c | 3 +-- target/arm/kvm32.c | 22 ++++++++++++++-------- target/arm/kvm64.c | 22 ++++++++++++++-------- 4 files changed, 30 insertions(+), 18 deletions(-) -- 2.9.3 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH 1/2] HACK: update linux/kvm header 2017-02-27 17:37 [Qemu-devel] [PATCH 0/2] Enable QEMU to control MPIDR values Andrew Jones @ 2017-02-27 17:37 ` Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can Andrew Jones 1 sibling, 0 replies; 5+ messages in thread From: Andrew Jones @ 2017-02-27 17:37 UTC (permalink / raw) To: qemu-devel, qemu-arm Cc: peter.maydell, christoffer.dall, marc.zyngier, imammedo --- linux-headers/linux/kvm.h | 1 + 1 file changed, 1 insertion(+) diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h index bb0ed712232d..38e636c85886 100644 --- a/linux-headers/linux/kvm.h +++ b/linux-headers/linux/kvm.h @@ -870,6 +870,7 @@ struct kvm_ppc_smmu_info { #define KVM_CAP_S390_USER_INSTR0 130 #define KVM_CAP_MSI_DEVID 131 #define KVM_CAP_PPC_HTM 132 +#define KVM_CAP_ARM_USER_MPIDR 137 #ifdef KVM_CAP_IRQ_ROUTING -- 2.9.3 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can 2017-02-27 17:37 [Qemu-devel] [PATCH 0/2] Enable QEMU to control MPIDR values Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 1/2] HACK: update linux/kvm header Andrew Jones @ 2017-02-27 17:37 ` Andrew Jones 2017-03-02 16:13 ` Peter Maydell 1 sibling, 1 reply; 5+ messages in thread From: Andrew Jones @ 2017-02-27 17:37 UTC (permalink / raw) To: qemu-devel, qemu-arm Cc: peter.maydell, christoffer.dall, marc.zyngier, imammedo If KVM supports user provided MPIDRs for the vcpus, then provide them. This simplifies management of vcpus as we can be sure of the identity of a vcpu even before it's been instantiated. Cc: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Andrew Jones <drjones@redhat.com> --- target/arm/cpu.c | 3 +-- target/arm/kvm32.c | 22 ++++++++++++++-------- target/arm/kvm64.c | 22 ++++++++++++++-------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/target/arm/cpu.c b/target/arm/cpu.c index f7157dc0e59d..83cd5eefbef8 100644 --- a/target/arm/cpu.c +++ b/target/arm/cpu.c @@ -741,8 +741,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) return; } - /* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it. - * We don't support setting cluster ID ([16..23]) (known as Aff2 + /* We don't currently support setting cluster ID ([16..23]) (known as Aff2 * in later ARM ARM versions), or any of the higher affinity level fields, * so these bits always RAZ. */ diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c index 069da0c5fd10..5ad732498e5c 100644 --- a/target/arm/kvm32.c +++ b/target/arm/kvm32.c @@ -186,7 +186,6 @@ int kvm_arch_init_vcpu(CPUState *cs) { int ret; uint64_t v; - uint32_t mpidr; struct kvm_one_reg r; ARMCPU *cpu = ARM_CPU(cs); @@ -223,16 +222,23 @@ int kvm_arch_init_vcpu(CPUState *cs) return -EINVAL; } - /* - * When KVM is in use, PSCI is emulated in-kernel and not by qemu. - * Currently KVM has its own idea about MPIDR assignment, so we - * override our defaults with what we get from KVM. - */ - ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_USER_MPIDR)) { + ret = kvm_set_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), + &cpu->mp_affinity); + } else { + /* If we can't set the MPIDR, then KVM will generate one. We must + * update our copy to that one in order to stay synchronized. + */ + uint32_t mpidr; + + ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); + if (!ret) { + cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; + } + } if (ret) { return ret; } - cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; return kvm_arm_init_cpreg_list(cpu); } diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index 61111091ad3b..a7d3f876c43b 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -486,7 +486,6 @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUClass *ahcc) int kvm_arch_init_vcpu(CPUState *cs) { int ret; - uint64_t mpidr; ARMCPU *cpu = ARM_CPU(cs); CPUARMState *env = &cpu->env; @@ -524,16 +523,23 @@ int kvm_arch_init_vcpu(CPUState *cs) return ret; } - /* - * When KVM is in use, PSCI is emulated in-kernel and not by qemu. - * Currently KVM has its own idea about MPIDR assignment, so we - * override our defaults with what we get from KVM. - */ - ret = kvm_get_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MPIDR), &mpidr); + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_USER_MPIDR)) { + ret = kvm_set_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MPIDR), + &cpu->mp_affinity); + } else { + /* If we can't set the MPIDR, then KVM will generate one. We must + * update our copy to that one in order to stay synchronized. + */ + uint64_t mpidr; + + ret = kvm_get_one_reg(cs, ARM64_SYS_REG(ARM_CPU_ID_MPIDR), &mpidr); + if (!ret) { + cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK; + } + } if (ret) { return ret; } - cpu->mp_affinity = mpidr & ARM64_AFFINITY_MASK; kvm_arm_init_debug(cs); -- 2.9.3 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can 2017-02-27 17:37 ` [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can Andrew Jones @ 2017-03-02 16:13 ` Peter Maydell 2017-03-02 16:23 ` Andrew Jones 0 siblings, 1 reply; 5+ messages in thread From: Peter Maydell @ 2017-03-02 16:13 UTC (permalink / raw) To: Andrew Jones Cc: QEMU Developers, qemu-arm, Christoffer Dall, Marc Zyngier, Igor Mammedov On 27 February 2017 at 17:37, Andrew Jones <drjones@redhat.com> wrote: > If KVM supports user provided MPIDRs for the vcpus, then provide > them. This simplifies management of vcpus as we can be sure of > the identity of a vcpu even before it's been instantiated. > > Cc: Igor Mammedov <imammedo@redhat.com> > Signed-off-by: Andrew Jones <drjones@redhat.com> > --- > target/arm/cpu.c | 3 +-- > target/arm/kvm32.c | 22 ++++++++++++++-------- > target/arm/kvm64.c | 22 ++++++++++++++-------- > 3 files changed, 29 insertions(+), 18 deletions(-) > > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > index f7157dc0e59d..83cd5eefbef8 100644 > --- a/target/arm/cpu.c > +++ b/target/arm/cpu.c > @@ -741,8 +741,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) > return; > } > > - /* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it. > - * We don't support setting cluster ID ([16..23]) (known as Aff2 > + /* We don't currently support setting cluster ID ([16..23]) (known as Aff2 > * in later ARM ARM versions), or any of the higher affinity level fields, > * so these bits always RAZ. > */ > diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c > index 069da0c5fd10..5ad732498e5c 100644 > --- a/target/arm/kvm32.c > +++ b/target/arm/kvm32.c > @@ -186,7 +186,6 @@ int kvm_arch_init_vcpu(CPUState *cs) > { > int ret; > uint64_t v; > - uint32_t mpidr; > struct kvm_one_reg r; > ARMCPU *cpu = ARM_CPU(cs); > > @@ -223,16 +222,23 @@ int kvm_arch_init_vcpu(CPUState *cs) > return -EINVAL; > } > > - /* > - * When KVM is in use, PSCI is emulated in-kernel and not by qemu. > - * Currently KVM has its own idea about MPIDR assignment, so we > - * override our defaults with what we get from KVM. > - */ > - ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); > + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_USER_MPIDR)) { > + ret = kvm_set_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), > + &cpu->mp_affinity); mp_affinity is only the affinity bits of the MPIDR. I would expect the kernel set_one_reg interface for the MPIDR to want a complete MPIDR value with M, U and MT bits. (compare the way that when we set mp_affinity from the kernel reg. value we mask out the bits we don't care about). Similarly with the 64-bit version of this code. > + } else { > + /* If we can't set the MPIDR, then KVM will generate one. We must > + * update our copy to that one in order to stay synchronized. > + */ > + uint32_t mpidr; > + > + ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); > + if (!ret) { > + cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; > + } > + } > if (ret) { > return ret; > } > - cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; > > return kvm_arm_init_cpreg_list(cpu); Otherwise this looks fine to me. PS: I assume we are targeting 2.10 (or whatever we call it) with this. thanks -- PMM ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can 2017-03-02 16:13 ` Peter Maydell @ 2017-03-02 16:23 ` Andrew Jones 0 siblings, 0 replies; 5+ messages in thread From: Andrew Jones @ 2017-03-02 16:23 UTC (permalink / raw) To: Peter Maydell Cc: QEMU Developers, qemu-arm, Christoffer Dall, Marc Zyngier, Igor Mammedov On Thu, Mar 02, 2017 at 04:13:40PM +0000, Peter Maydell wrote: > On 27 February 2017 at 17:37, Andrew Jones <drjones@redhat.com> wrote: > > If KVM supports user provided MPIDRs for the vcpus, then provide > > them. This simplifies management of vcpus as we can be sure of > > the identity of a vcpu even before it's been instantiated. > > > > Cc: Igor Mammedov <imammedo@redhat.com> > > Signed-off-by: Andrew Jones <drjones@redhat.com> > > --- > > target/arm/cpu.c | 3 +-- > > target/arm/kvm32.c | 22 ++++++++++++++-------- > > target/arm/kvm64.c | 22 ++++++++++++++-------- > > 3 files changed, 29 insertions(+), 18 deletions(-) > > > > diff --git a/target/arm/cpu.c b/target/arm/cpu.c > > index f7157dc0e59d..83cd5eefbef8 100644 > > --- a/target/arm/cpu.c > > +++ b/target/arm/cpu.c > > @@ -741,8 +741,7 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp) > > return; > > } > > > > - /* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it. > > - * We don't support setting cluster ID ([16..23]) (known as Aff2 > > + /* We don't currently support setting cluster ID ([16..23]) (known as Aff2 > > * in later ARM ARM versions), or any of the higher affinity level fields, > > * so these bits always RAZ. > > */ > > diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c > > index 069da0c5fd10..5ad732498e5c 100644 > > --- a/target/arm/kvm32.c > > +++ b/target/arm/kvm32.c > > @@ -186,7 +186,6 @@ int kvm_arch_init_vcpu(CPUState *cs) > > { > > int ret; > > uint64_t v; > > - uint32_t mpidr; > > struct kvm_one_reg r; > > ARMCPU *cpu = ARM_CPU(cs); > > > > @@ -223,16 +222,23 @@ int kvm_arch_init_vcpu(CPUState *cs) > > return -EINVAL; > > } > > > > - /* > > - * When KVM is in use, PSCI is emulated in-kernel and not by qemu. > > - * Currently KVM has its own idea about MPIDR assignment, so we > > - * override our defaults with what we get from KVM. > > - */ > > - ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); > > + if (kvm_check_extension(cs->kvm_state, KVM_CAP_ARM_USER_MPIDR)) { > > + ret = kvm_set_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), > > + &cpu->mp_affinity); > > mp_affinity is only the affinity bits of the MPIDR. I would expect > the kernel set_one_reg interface for the MPIDR to want a complete > MPIDR value with M, U and MT bits. Thanks, I'll fix this. > > (compare the way that when we set mp_affinity from the kernel > reg. value we mask out the bits we don't care about). > > Similarly with the 64-bit version of this code. > > > + } else { > > + /* If we can't set the MPIDR, then KVM will generate one. We must > > + * update our copy to that one in order to stay synchronized. > > + */ > > + uint32_t mpidr; > > + > > + ret = kvm_get_one_reg(cs, ARM_CP15_REG32(ARM_CPU_ID_MPIDR), &mpidr); > > + if (!ret) { > > + cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; > > + } > > + } > > if (ret) { > > return ret; > > } > > - cpu->mp_affinity = mpidr & ARM32_AFFINITY_MASK; > > > > return kvm_arm_init_cpreg_list(cpu); > > Otherwise this looks fine to me. > > PS: I assume we are targeting 2.10 (or whatever we call it) with this. Yeah, this is 2.10 material. Thanks, drew ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-03-02 16:23 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-02-27 17:37 [Qemu-devel] [PATCH 0/2] Enable QEMU to control MPIDR values Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 1/2] HACK: update linux/kvm header Andrew Jones 2017-02-27 17:37 ` [Qemu-devel] [PATCH 2/2] arm: kvm: set MPIDR when we can Andrew Jones 2017-03-02 16:13 ` Peter Maydell 2017-03-02 16:23 ` Andrew Jones
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).