kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Laurent Vivier <lvivier@redhat.com>
To: Paul Mackerras <paulus@ozlabs.org>,
	kvm@vger.kernel.org, kvm-ppc@vger.kernel.org
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [PATCH v2] KVM: PPC: Book3S HV: Make HPT resizing work on POWER9
Date: Thu, 8 Feb 2018 19:11:15 +0100	[thread overview]
Message-ID: <0edafa00-5e2d-7aa8-4b30-9b33cbc0dc1b@redhat.com> (raw)
In-Reply-To: <20180207091135.GE19335@fergus.ozlabs.ibm.com>

On 07/02/2018 10:11, Paul Mackerras wrote:
> From: David Gibson <david@gibson.dropbear.id.au>
> 
> This adds code to enable the HPT resizing code to work on POWER9,
> which uses a slightly modified HPT entry format compared to POWER8.
> On POWER9, we convert HPTEs read from the HPT from the new format to
> the old format so that the rest of the HPT resizing code can work as
> before.  HPTEs written to the new HPT are converted to the new format
> as the last step before writing them into the new HPT.
> 
> This takes out the checks added by commit bcd3bb63dbc8 ("KVM: PPC:
> Book3S HV: Disable HPT resizing on POWER9 for now", 2017-02-18),
> now that HPT resizing works on POWER9.
> 
> On POWER9, when we pivot to the new HPT, we now call
> kvmppc_setup_partition_table() to update the partition table in order
> to make the hardware use the new HPT.
> 
> [paulus@ozlabs.org - added kvmppc_setup_partition_table() call,
>  wrote commit message.]
> 
> Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
> ---
> v2: Include change to powerpc.c, which somehow got missed in v1.
> 
>  arch/powerpc/kvm/book3s_64_mmu_hv.c | 30 +++++++++++++++++++++++-------
>  arch/powerpc/kvm/powerpc.c          |  3 +--
>  2 files changed, 24 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
> index d196499..cb34be7 100644
> --- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
> +++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
> @@ -1261,6 +1261,11 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
>  		/* Nothing to do */
>  		goto out;
>  
> +	if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> +		rpte = be64_to_cpu(hptep[1]);
> +		vpte = hpte_new_to_old_v(vpte, rpte);
> +	}
> +
>  	/* Unmap */
>  	rev = &old->rev[idx];
>  	guest_rpte = rev->guest_rpte;
> @@ -1290,7 +1295,6 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
>  
>  	/* Reload PTE after unmap */
>  	vpte = be64_to_cpu(hptep[0]);
> -
>  	BUG_ON(vpte & HPTE_V_VALID);
>  	BUG_ON(!(vpte & HPTE_V_ABSENT));
>  
> @@ -1299,6 +1303,12 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
>  		goto out;
>  
>  	rpte = be64_to_cpu(hptep[1]);
> +
> +	if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> +		vpte = hpte_new_to_old_v(vpte, rpte);
> +		rpte = hpte_new_to_old_r(rpte);
> +	}
> +
>  	pshift = kvmppc_hpte_base_page_shift(vpte, rpte);
>  	avpn = HPTE_V_AVPN_VAL(vpte) & ~(((1ul << pshift) - 1) >> 23);
>  	pteg = idx / HPTES_PER_GROUP;
> @@ -1336,6 +1346,10 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
>  	new_hptep = (__be64 *)(new->virt + (new_idx << 4));
>  
>  	replace_vpte = be64_to_cpu(new_hptep[0]);
> +	if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> +		unsigned long replace_rpte = be64_to_cpu(new_hptep[1]);
> +		replace_vpte = hpte_new_to_old_v(replace_vpte, replace_rpte);
> +	}
>  
>  	if (replace_vpte & (HPTE_V_VALID | HPTE_V_ABSENT)) {
>  		BUG_ON(new->order >= old->order);
> @@ -1351,6 +1365,11 @@ static unsigned long resize_hpt_rehash_hpte(struct kvm_resize_hpt *resize,
>  		/* Discard the previous HPTE */
>  	}
>  
> +	if (cpu_has_feature(CPU_FTR_ARCH_300)) {
> +		rpte = hpte_old_to_new_r(vpte, rpte);
> +		vpte = hpte_old_to_new_v(vpte);
> +	}
> +
>  	new_hptep[1] = cpu_to_be64(rpte);
>  	new->rev[new_idx].guest_rpte = guest_rpte;
>  	/* No need for a barrier, since new HPT isn't active */
> @@ -1368,12 +1387,6 @@ static int resize_hpt_rehash(struct kvm_resize_hpt *resize)
>  	unsigned  long i;
>  	int rc;
>  
> -	/*
> -	 * resize_hpt_rehash_hpte() doesn't handle the new-format HPTEs
> -	 * that POWER9 uses, and could well hit a BUG_ON on POWER9.
> -	 */
> -	if (cpu_has_feature(CPU_FTR_ARCH_300))
> -		return -EIO;
>  	for (i = 0; i < kvmppc_hpt_npte(&kvm->arch.hpt); i++) {
>  		rc = resize_hpt_rehash_hpte(resize, i);
>  		if (rc != 0)
> @@ -1404,6 +1417,9 @@ static void resize_hpt_pivot(struct kvm_resize_hpt *resize)
>  
>  	synchronize_srcu_expedited(&kvm->srcu);
>  
> +	if (cpu_has_feature(CPU_FTR_ARCH_300))
> +		kvmppc_setup_partition_table(kvm);
> +
>  	resize_hpt_debug(resize, "resize_hpt_pivot() done\n");
>  }
>  
> diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> index b4010b8..47c7a30 100644
> --- a/arch/powerpc/kvm/powerpc.c
> +++ b/arch/powerpc/kvm/powerpc.c
> @@ -633,8 +633,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
>  		r = 1;
>  		break;
>  	case KVM_CAP_SPAPR_RESIZE_HPT:
> -		/* Disable this on POWER9 until code handles new HPTE format */
> -		r = !!hv_enabled && !cpu_has_feature(CPU_FTR_ARCH_300);
> +		r = !!hv_enabled;
>  		break;
>  #endif
>  #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
> 

I've tested this series with a RHEL 4.14 kernel on a POWER9 host and a
RHEL 3.10 kernel in the guest (max-cpu-compat=power8 and
"-m 80G,slots=256,maxmem=257G"), all works well:

[root@localhost ~]# cat /sys/kernel/debug/powerpc/hpt_order

30

[root@localhost ~]# echo 31 > /sys/kernel/debug/powerpc/hpt_order

[   65.888226] lpar: Attempting to resize HPT to shift 31

[   66.634834] lpar: HPT resize to shift 31 complete (210 ms / 535 ms)

[root@localhost ~]# cat /sys/kernel/debug/powerpc/hpt_order

31

[root@localhost ~]# echo 29 > /sys/kernel/debug/powerpc/hpt_order

[   77.023857] lpar: Attempting to resize HPT to shift 29

[   77.739819] lpar: HPT resize to shift 29 complete (105 ms / 610 ms)

[root@localhost ~]# cat /sys/kernel/debug/powerpc/hpt_order

29

Previously, it was failing with:

-bash: echo: write error: No such device

Tested-by: Laurent Vivier <lvivier@redhat.com>

Thanks,
Laurent

  reply	other threads:[~2018-02-08 18:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-07  9:04 [PATCH 1/2] KVM: PPC: Book3S HV: Fix handling of secondary HPTEG in HPT resizing code Paul Mackerras
2018-02-07  9:06 ` [PATCH 2/2] KVM: PPC: Book3S HV: Make HPT resizing work on POWER9 Paul Mackerras
2018-02-07  9:11   ` [PATCH v2] " Paul Mackerras
2018-02-08 18:11     ` Laurent Vivier [this message]
2018-02-08 23:40     ` David Gibson
2018-02-08 23:35 ` [PATCH 1/2] KVM: PPC: Book3S HV: Fix handling of secondary HPTEG in HPT resizing code David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0edafa00-5e2d-7aa8-4b30-9b33cbc0dc1b@redhat.com \
    --to=lvivier@redhat.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=paulus@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).