Ram Pai <linux...@us.ibm.com> writes:

....

> diff --git a/arch/powerpc/mm/hugetlbpage-hash64.c 
> b/arch/powerpc/mm/hugetlbpage-hash64.c
> index a84bb44..239ca86 100644
> --- a/arch/powerpc/mm/hugetlbpage-hash64.c
> +++ b/arch/powerpc/mm/hugetlbpage-hash64.c
> @@ -22,6 +22,7 @@ int __hash_page_huge(unsigned long ea, unsigned long 
> access, unsigned long vsid,
>                    pte_t *ptep, unsigned long trap, unsigned long flags,
>                    int ssize, unsigned int shift, unsigned int mmu_psize)
>  {
> +     real_pte_t rpte;
>       unsigned long vpn;
>       unsigned long old_pte, new_pte;
>       unsigned long rflags, pa, sz;
> @@ -61,6 +62,7 @@ int __hash_page_huge(unsigned long ea, unsigned long 
> access, unsigned long vsid,
>       } while(!pte_xchg(ptep, __pte(old_pte), __pte(new_pte)));
>
>       rflags = htab_convert_pte_flags(new_pte);
> +     rpte = __real_pte(__pte(old_pte), ptep);
>
>       sz = ((1UL) << shift);
>       if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
> @@ -71,15 +73,10 @@ int __hash_page_huge(unsigned long ea, unsigned long 
> access, unsigned long vsid,
>       /* Check if pte already has an hpte (case 2) */
>       if (unlikely(old_pte & H_PAGE_HASHPTE)) {
>               /* There MIGHT be an HPTE for this pte */
> -             unsigned long hash, slot;
> +             unsigned long gslot;
>
> -             hash = hpt_hash(vpn, shift, ssize);
> -             if (old_pte & H_PAGE_F_SECOND)
> -                     hash = ~hash;
> -             slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
> -             slot += (old_pte & H_PAGE_F_GIX) >> H_PAGE_F_GIX_SHIFT;
> -
> -             if (mmu_hash_ops.hpte_updatepp(slot, rflags, vpn, mmu_psize,
> +             gslot = get_hidx_gslot(vpn, shift, ssize, rpte, 0);
> +             if (mmu_hash_ops.hpte_updatepp(gslot, rflags, vpn, mmu_psize,
>                                              mmu_psize, ssize, flags) == -1)
>                       old_pte &= ~_PAGE_HPTEFLAGS;
>       }
> @@ -106,8 +103,7 @@ int __hash_page_huge(unsigned long ea, unsigned long 
> access, unsigned long vsid,
>                       return -1;
>               }
>
> -             new_pte |= (slot << H_PAGE_F_GIX_SHIFT) &
> -                     (H_PAGE_F_SECOND | H_PAGE_F_GIX);
> +             new_pte |= set_hidx_slot(ptep, rpte, 0, slot);

We don't really need rpte here. We are just need to track one entry
here. May be it becomes simpler if use different helpers for 4k hpte and
others ?

-aneesh

Reply via email to