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