Ram Pai <linux...@us.ibm.com> writes: > diff --git a/arch/powerpc/mm/hash64_64k.c b/arch/powerpc/mm/hash64_64k.c > index 1a68cb1..c6c5559 100644 > --- a/arch/powerpc/mm/hash64_64k.c > +++ b/arch/powerpc/mm/hash64_64k.c > @@ -126,18 +113,13 @@ int __hash_page_4K(unsigned long ea, unsigned long > access, unsigned long vsid, > if (__rpte_sub_valid(rpte, subpg_index)) { > int ret; > > - hash = hpt_hash(vpn, shift, ssize); > - hidx = __rpte_to_hidx(rpte, subpg_index); > - if (hidx & _PTEIDX_SECONDARY) > - hash = ~hash; > - slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; > - slot += hidx & _PTEIDX_GROUP_IX; > + gslot = pte_get_hash_gslot(vpn, shift, ssize, rpte, > + subpg_index); > + ret = mmu_hash_ops.hpte_updatepp(gslot, rflags, vpn, > + MMU_PAGE_4K, MMU_PAGE_4K, ssize, flags);
This was formatted correctly before: > - ret = mmu_hash_ops.hpte_updatepp(slot, rflags, vpn, > - MMU_PAGE_4K, MMU_PAGE_4K, > - ssize, flags); > /* > - *if we failed because typically the HPTE wasn't really here > + * if we failed because typically the HPTE wasn't really here If you're fixing it up please make it "If ...". > * we try an insertion. > */ > if (ret == -1) > @@ -148,6 +130,15 @@ int __hash_page_4K(unsigned long ea, unsigned long > access, unsigned long vsid, > } > > htab_insert_hpte: > + > + /* > + * initialize all hidx entries to invalid value, > + * the first time the PTE is about to allocate > + * a 4K hpte > + */ Should be: /* * Initialize all hidx entries to invalid value, the first time * the PTE is about to allocate a 4K HPTE. */ > + if (!(old_pte & H_PAGE_COMBO)) > + rpte.hidx = ~0x0UL; > + Paul had the idea that if we biased the slot number by 1, we could make the "invalid" value be == 0. That would avoid needing to that above, and also mean the value is correctly invalid from the get-go, which would be good IMO. I think now that you've added the slot accessors it would be pretty easy to do. > /* > * handle H_PAGE_4K_PFN case > */ > @@ -172,15 +163,41 @@ int __hash_page_4K(unsigned long ea, unsigned long > access, unsigned long vsid, > * Primary is full, try the secondary > */ > if (unlikely(slot == -1)) { > + bool soft_invalid; > + > hpte_group = ((~hash & htab_hash_mask) * HPTES_PER_GROUP) & > ~0x7UL; > slot = mmu_hash_ops.hpte_insert(hpte_group, vpn, pa, > rflags, HPTE_V_SECONDARY, > MMU_PAGE_4K, MMU_PAGE_4K, > ssize); > - if (slot == -1) { > - if (mftb() & 0x1) > + > + soft_invalid = hpte_soft_invalid(slot); > + if (unlikely(soft_invalid)) { > + /* > + * we got a valid slot from a hardware point of view. > + * but we cannot use it, because we use this special > + * value; as defined by hpte_soft_invalid(), > + * to track invalid slots. We cannot use it. > + * So invalidate it. > + */ > + gslot = slot & _PTEIDX_GROUP_IX; > + mmu_hash_ops.hpte_invalidate(hpte_group+gslot, vpn, > + MMU_PAGE_4K, MMU_PAGE_4K, > + ssize, 0); Please: mmu_hash_ops.hpte_invalidate(hpte_group+gslot, vpn, MMU_PAGE_4K, MMU_PAGE_4K, ssize, 0); > + } > + > + if (unlikely(slot == -1 || soft_invalid)) { > + /* > + * for soft invalid slot, lets ensure that we For .. let's cheers