From: David Gibson <david@gibson.dropbear.id.au>
To: Paul Mackerras <paulus@ozlabs.org>
Cc: kvm@vger.kernel.org, kvm-ppc@vger.kernel.org
Subject: Re: [PATCH v2] KVM: PPC: Book3S HV: Make HPT resizing work on POWER9
Date: Fri, 9 Feb 2018 10:40:34 +1100 [thread overview]
Message-ID: <20180208234034.GF11634@umbus.fritz.box> (raw)
In-Reply-To: <20180207091135.GE19335@fergus.ozlabs.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 5108 bytes --]
On Wed, Feb 07, 2018 at 08:11:35PM +1100, 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>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
> ---
> 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
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2018-02-08 23:40 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
2018-02-08 23:40 ` David Gibson [this message]
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=20180208234034.GF11634@umbus.fritz.box \
--to=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).