ACK: [Bionic][PATCH 1/1] KVM: PPC: Book3S HV: Allow HPT and radix on the same core for POWER9 v2.2
Khaled Elmously
khalid.elmously at canonical.com
Mon Mar 19 16:22:57 UTC 2018
On 2018-03-19 10:50:00 , Joseph Salisbury wrote:
> From: Paul Mackerras <paulus at ozlabs.org>
>
> BugLink: http://bugs.launchpad.net/bugs/1756254
>
> POWER9 chip versions starting with "Nimbus" v2.2 can support running
> with some threads of a core in HPT mode and others in radix mode.
> This means that we don't have to prohibit independent-threads mode
> when running a HPT guest on a radix host, and we don't have to do any
> of the synchronization between threads that was introduced in commit
> c01015091a77 ("KVM: PPC: Book3S HV: Run HPT guests on POWER9 radix
> hosts", 2017-10-19).
>
> Rather than using up another CPU feature bit, we just do an
> explicit test on the PVR (processor version register) at module
> startup time to determine whether we have to take steps to avoid
> having some threads in HPT mode and some in radix mode (so-called
> "mixed mode"). We test for "Nimbus" (indicated by 0 or 1 in the top
> nibble of the lower 16 bits) v2.2 or later, or "Cumulus" (indicated by
> 2 or 3 in that nibble) v1.1 or later.
>
> Signed-off-by: Paul Mackerras <paulus at ozlabs.org>
> (cherry picked from commit 00608e1f007e4cf6031485c5630e0e504bceef9b)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
> arch/powerpc/kvm/book3s_hv.c | 30 ++++++++++++++++++++++++------
> 1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
> index 6c402f6..d3a8b73 100644
> --- a/arch/powerpc/kvm/book3s_hv.c
> +++ b/arch/powerpc/kvm/book3s_hv.c
> @@ -118,6 +118,9 @@ module_param_cb(h_ipi_redirect, &module_param_ops, &h_ipi_redirect,
> MODULE_PARM_DESC(h_ipi_redirect, "Redirect H_IPI wakeup to a free host core");
> #endif
>
> +/* If set, the threads on each CPU core have to be in the same MMU mode */
> +static bool no_mixing_hpt_and_radix;
> +
> static void kvmppc_end_cede(struct kvm_vcpu *vcpu);
> static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu);
>
> @@ -2385,8 +2388,8 @@ static void init_core_info(struct core_info *cip, struct kvmppc_vcore *vc)
> static bool subcore_config_ok(int n_subcores, int n_threads)
> {
> /*
> - * POWER9 "SMT4" cores are permanently in what is effectively a 4-way split-core
> - * mode, with one thread per subcore.
> + * POWER9 "SMT4" cores are permanently in what is effectively a 4-way
> + * split-core mode, with one thread per subcore.
> */
> if (cpu_has_feature(CPU_FTR_ARCH_300))
> return n_subcores <= 4 && n_threads == 1;
> @@ -2422,8 +2425,8 @@ static bool can_dynamic_split(struct kvmppc_vcore *vc, struct core_info *cip)
> if (!cpu_has_feature(CPU_FTR_ARCH_207S))
> return false;
>
> - /* POWER9 currently requires all threads to be in the same MMU mode */
> - if (cpu_has_feature(CPU_FTR_ARCH_300) &&
> + /* Some POWER9 chips require all threads to be in the same MMU mode */
> + if (no_mixing_hpt_and_radix &&
> kvm_is_radix(vc->kvm) != kvm_is_radix(cip->vc[0]->kvm))
> return false;
>
> @@ -2686,9 +2689,11 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
> * threads are offline. Also check if the number of threads in this
> * guest are greater than the current system threads per guest.
> * On POWER9, we need to be not in independent-threads mode if
> - * this is a HPT guest on a radix host.
> + * this is a HPT guest on a radix host machine where the
> + * CPU threads may not be in different MMU modes.
> */
> - hpt_on_radix = radix_enabled() && !kvm_is_radix(vc->kvm);
> + hpt_on_radix = no_mixing_hpt_and_radix && radix_enabled() &&
> + !kvm_is_radix(vc->kvm);
> if (((controlled_threads > 1) &&
> ((vc->num_threads > threads_per_subcore) || !on_primary_thread())) ||
> (hpt_on_radix && vc->kvm->arch.threads_indep)) {
> @@ -4456,6 +4461,19 @@ static int kvmppc_book3s_init_hv(void)
>
> if (kvmppc_radix_possible())
> r = kvmppc_radix_init();
> +
> + /*
> + * POWER9 chips before version 2.02 can't have some threads in
> + * HPT mode and some in radix mode on the same core.
> + */
> + if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> + unsigned int pvr = mfspr(SPRN_PVR);
> + if ((pvr >> 16) == PVR_POWER9 &&
> + (((pvr & 0xe000) == 0 && (pvr & 0xfff) < 0x202) ||
> + ((pvr & 0xe000) == 0x2000 && (pvr & 0xfff) < 0x101)))
> + no_mixing_hpt_and_radix = true;
> + }
> +
> return r;
> }
>
Acked-by: Khalid Elmously <khalid.elmously at canonical.com>
More information about the kernel-team
mailing list