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
next prev parent 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).