On Mon, Mar 07, 2016 at 02:41:34PM +0100, Greg Kurz wrote:
> On Mon,  7 Mar 2016 13:26:26 +1100
> David Gibson <da...@gibson.dropbear.id.au> wrote:
> 
> > fa48b43 "target-ppc: Remove hack for ppc_hash64_load_hpte*() with HV KVM"
> > purports to remove a hack in the handling of hash page tables (HPTs)
> > managed by KVM instead of qemu.  However, it actually went in the wrong
> > direction.
> > 
> > That patch requires anything looking for an external HPT (that is one not
> > managed by the guest itself) to check both env->external_htab (for a qemu
> > managed HPT) and kvmppc_kern_htab (for a KVM managed HPT).  That's a
> > problem because kvmppc_kern_htab is local to mmu-hash64.c, but some places
> > which need to check for an external HPT are outside that, such as
> > kvm_arch_get_registers().  The latter was subtly broken by the earlier
> > patch such that gdbstub can no longer access memory.
> > 
> > Basically a KVM managed HPT is much more like a qemu managed HPT than it is
> > like a guest managed HPT, so the original "hack" was actually on the right
> > track.
> > 
> > This partially reverts fa48b43, so we again mark a KVM managed external HPT
> > by putting a special but non-NULL value in env->external_htab.  It then
> > goes further, using that marker to eliminate the kvmppc_kern_htab global
> > entirely.  The ppc_hash64_set_external_hpt() helper function is extended
> > to set that marker if passed a NULL value (if you're setting an external
> > HPT, but don't have an actual HPT to set, the assumption is that it must
> > be a KVM managed HPT).
> > 
> > This also has some flow-on changes to the HPT access helpers, required by
> > the above changes.
> > 
> > Reported-by: Greg Kurz <gk...@linux.vnet.ibm.com>
> > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
> > Reviewed-by: Thomas Huth <th...@redhat.com>
> > ---
> 
> Typo in comment in target-ppc/mmu-hash64.c (see below).
> 
> Apart from that, you get:
> 
> Reviewed-by: Greg Kurz <gk...@linux.vnet.ibm.com>
> 
> and also...
> 
> without this patch:
> 
> 0x00000000100009b8 in main (argc=<error reading variable: Cannot access 
> memory at address 0x3fffc03ce270>, argv=<error reading variable: Cannot 
> access memory at address 0x3fffc03ce278>) at fp.c:11
> 
> with this patch:
> 
> 0x00000000100009b8 in main (argc=4, argv=0x3fffc7fcfd18) at fp.c:11
> 
> Just to be sure, I've also tested with TCG: no regression.
> 
> Thanks for the fix !
> 
> Tested-by: Greg Kurz <gk...@linux.vnet.ibm.com>

Thanks.

> >  hw/ppc/spapr.c          |  3 +--
> >  hw/ppc/spapr_hcall.c    | 10 +++++-----
> >  target-ppc/mmu-hash64.c | 40 ++++++++++++++++++----------------------
> >  target-ppc/mmu-hash64.h |  9 +++------
> >  4 files changed, 27 insertions(+), 35 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 72a018b..43708a2 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -1091,7 +1091,7 @@ static void spapr_reallocate_hpt(sPAPRMachineState 
> > *spapr, int shift,
> >          }
> > 
> >          spapr->htab_shift = shift;
> > -        kvmppc_kern_htab = true;
> > +        spapr->htab = NULL;
> >      } else {
> >          /* kernel-side HPT not needed, allocate in userspace instead */
> >          size_t size = 1ULL << shift;
> > @@ -1106,7 +1106,6 @@ static void spapr_reallocate_hpt(sPAPRMachineState 
> > *spapr, int shift,
> > 
> >          memset(spapr->htab, 0, size);
> >          spapr->htab_shift = shift;
> > -        kvmppc_kern_htab = false;
> > 
> >          for (i = 0; i < size / HASH_PTE_SIZE_64; i++) {
> >              DIRTY_HPTE(HPTE(spapr->htab, i));
> > diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> > index 1733482..b2b1b93 100644
> > --- a/hw/ppc/spapr_hcall.c
> > +++ b/hw/ppc/spapr_hcall.c
> > @@ -122,17 +122,17 @@ static target_ulong h_enter(PowerPCCPU *cpu, 
> > sPAPRMachineState *spapr,
> >                  break;
> >              }
> >          }
> > -        ppc_hash64_stop_access(token);
> > +        ppc_hash64_stop_access(cpu, token);
> >          if (index == 8) {
> >              return H_PTEG_FULL;
> >          }
> >      } else {
> >          token = ppc_hash64_start_access(cpu, pte_index);
> >          if (ppc_hash64_load_hpte0(cpu, token, 0) & HPTE64_V_VALID) {
> > -            ppc_hash64_stop_access(token);
> > +            ppc_hash64_stop_access(cpu, token);
> >              return H_PTEG_FULL;
> >          }
> > -        ppc_hash64_stop_access(token);
> > +        ppc_hash64_stop_access(cpu, token);
> >      }
> > 
> >      ppc_hash64_store_hpte(cpu, pte_index + index,
> > @@ -165,7 +165,7 @@ static RemoveResult remove_hpte(PowerPCCPU *cpu, 
> > target_ulong ptex,
> >      token = ppc_hash64_start_access(cpu, ptex);
> >      v = ppc_hash64_load_hpte0(cpu, token, 0);
> >      r = ppc_hash64_load_hpte1(cpu, token, 0);
> > -    ppc_hash64_stop_access(token);
> > +    ppc_hash64_stop_access(cpu, token);
> > 
> >      if ((v & HPTE64_V_VALID) == 0 ||
> >          ((flags & H_AVPN) && (v & ~0x7fULL) != avpn) ||
> > @@ -288,7 +288,7 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
> > sPAPRMachineState *spapr,
> >      token = ppc_hash64_start_access(cpu, pte_index);
> >      v = ppc_hash64_load_hpte0(cpu, token, 0);
> >      r = ppc_hash64_load_hpte1(cpu, token, 0);
> > -    ppc_hash64_stop_access(token);
> > +    ppc_hash64_stop_access(cpu, token);
> > 
> >      if ((v & HPTE64_V_VALID) == 0 ||
> >          ((flags & H_AVPN) && (v & ~0x7fULL) != avpn)) {
> > diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c
> > index 7b5200b..a9ae0b3 100644
> > --- a/target-ppc/mmu-hash64.c
> > +++ b/target-ppc/mmu-hash64.c
> > @@ -36,10 +36,11 @@
> >  #endif
> > 
> >  /*
> > - * Used to indicate whether we have allocated htab in the
> > - * host kernel
> > + * Used to indicate that a CPU has it's hash page table (HPT) managed
> 
> s/it's/its

Oh dear.  That mispelling really annoys me, so it's an embarrassing
error.  Thanks for the catch.

-- 
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: signature.asc
Description: PGP signature

Reply via email to