powerpc/thp: Don't recompute vsid and ssize in loop on invalidate
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Wed, 13 Aug 2014 07:01:58 +0000 (12:31 +0530)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 13 Aug 2014 08:20:38 +0000 (18:20 +1000)
The segment identifier and segment size will remain the same in
the loop, So we can compute it outside. We also change the
hugepage_invalidate interface so that we can use it the later patch

CC: <stable@vger.kernel.org>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/machdep.h
arch/powerpc/mm/hash_native_64.c
arch/powerpc/mm/pgtable_64.c
arch/powerpc/platforms/pseries/lpar.c

index 44e90516519beedc607331528b3996f7f97bc39d..b125ceab149c0a8e428263093334d752ead4bdfa 100644 (file)
@@ -57,10 +57,10 @@ struct machdep_calls {
        void            (*hpte_removebolted)(unsigned long ea,
                                             int psize, int ssize);
        void            (*flush_hash_range)(unsigned long number, int local);
-       void            (*hugepage_invalidate)(struct mm_struct *mm,
+       void            (*hugepage_invalidate)(unsigned long vsid,
+                                              unsigned long addr,
                                               unsigned char *hpte_slot_array,
-                                              unsigned long addr, int psize);
-
+                                              int psize, int ssize);
        /* special for kexec, to be called in real mode, linear mapping is
         * destroyed as well */
        void            (*hpte_clear_all)(void);
index cf1d325eae8be814953650cf6b94fd349c0fdd12..fb89d7695a9aa0fbb031f76ec8cb4007afa71308 100644 (file)
@@ -412,18 +412,18 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long vpn,
        local_irq_restore(flags);
 }
 
-static void native_hugepage_invalidate(struct mm_struct *mm,
+static void native_hugepage_invalidate(unsigned long vsid,
+                                      unsigned long addr,
                                       unsigned char *hpte_slot_array,
-                                      unsigned long addr, int psize)
+                                      int psize, int ssize)
 {
-       int ssize = 0, i;
-       int lock_tlbie;
+       int i, lock_tlbie;
        struct hash_pte *hptep;
        int actual_psize = MMU_PAGE_16M;
        unsigned int max_hpte_count, valid;
        unsigned long flags, s_addr = addr;
        unsigned long hpte_v, want_v, shift;
-       unsigned long hidx, vpn = 0, vsid, hash, slot;
+       unsigned long hidx, vpn = 0, hash, slot;
 
        shift = mmu_psize_defs[psize].shift;
        max_hpte_count = 1U << (PMD_SHIFT - shift);
@@ -437,15 +437,6 @@ static void native_hugepage_invalidate(struct mm_struct *mm,
 
                /* get the vpn */
                addr = s_addr + (i * (1ul << shift));
-               if (!is_kernel_addr(addr)) {
-                       ssize = user_segment_size(addr);
-                       vsid = get_vsid(mm->context.id, addr, ssize);
-                       WARN_ON(vsid == 0);
-               } else {
-                       vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
-                       ssize = mmu_kernel_ssize;
-               }
-
                vpn = hpt_vpn(addr, vsid, ssize);
                hash = hpt_hash(vpn, shift, ssize);
                if (hidx & _PTEIDX_SECONDARY)
index 3b3c4d34c7a0ec48c08d037faa4260509541d6d6..5039f3b04d6ed930388282440cec48fdefda2eb6 100644 (file)
@@ -745,12 +745,21 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
        if (!hpte_slot_array)
                return;
 
-       /* get the base page size */
+       /* get the base page size,vsid and segment size */
        psize = get_slice_psize(mm, s_addr);
+       if (!is_kernel_addr(s_addr)) {
+               ssize = user_segment_size(s_addr);
+               vsid = get_vsid(mm->context.id, s_addr, ssize);
+               WARN_ON(vsid == 0);
+       } else {
+               vsid = get_kernel_vsid(s_addr, mmu_kernel_ssize);
+               ssize = mmu_kernel_ssize;
+       }
 
        if (ppc_md.hugepage_invalidate)
-               return ppc_md.hugepage_invalidate(mm, hpte_slot_array,
-                                                 s_addr, psize);
+               return ppc_md.hugepage_invalidate(vsid, s_addr,
+                                                 hpte_slot_array,
+                                                 psize, ssize);
        /*
         * No bluk hpte removal support, invalidate each entry
         */
@@ -768,15 +777,6 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
 
                /* get the vpn */
                addr = s_addr + (i * (1ul << shift));
-               if (!is_kernel_addr(addr)) {
-                       ssize = user_segment_size(addr);
-                       vsid = get_vsid(mm->context.id, addr, ssize);
-                       WARN_ON(vsid == 0);
-               } else {
-                       vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
-                       ssize = mmu_kernel_ssize;
-               }
-
                vpn = hpt_vpn(addr, vsid, ssize);
                hash = hpt_hash(vpn, shift, ssize);
                if (hidx & _PTEIDX_SECONDARY)
index fbfcef514aa742e8378d2bd959bdfee9cb8d9d98..34e64237fff9a9ca4cf6d62751e99feff41a3f1e 100644 (file)
@@ -431,16 +431,17 @@ static void __pSeries_lpar_hugepage_invalidate(unsigned long *slot,
                spin_unlock_irqrestore(&pSeries_lpar_tlbie_lock, flags);
 }
 
-static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm,
-                                      unsigned char *hpte_slot_array,
-                                      unsigned long addr, int psize)
+static void pSeries_lpar_hugepage_invalidate(unsigned long vsid,
+                                            unsigned long addr,
+                                            unsigned char *hpte_slot_array,
+                                            int psize, int ssize)
 {
-       int ssize = 0, i, index = 0;
+       int i, index = 0;
        unsigned long s_addr = addr;
        unsigned int max_hpte_count, valid;
        unsigned long vpn_array[PPC64_HUGE_HPTE_BATCH];
        unsigned long slot_array[PPC64_HUGE_HPTE_BATCH];
-       unsigned long shift, hidx, vpn = 0, vsid, hash, slot;
+       unsigned long shift, hidx, vpn = 0, hash, slot;
 
        shift = mmu_psize_defs[psize].shift;
        max_hpte_count = 1U << (PMD_SHIFT - shift);
@@ -453,15 +454,6 @@ static void pSeries_lpar_hugepage_invalidate(struct mm_struct *mm,
 
                /* get the vpn */
                addr = s_addr + (i * (1ul << shift));
-               if (!is_kernel_addr(addr)) {
-                       ssize = user_segment_size(addr);
-                       vsid = get_vsid(mm->context.id, addr, ssize);
-                       WARN_ON(vsid == 0);
-               } else {
-                       vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
-                       ssize = mmu_kernel_ssize;
-               }
-
                vpn = hpt_vpn(addr, vsid, ssize);
                hash = hpt_hash(vpn, shift, ssize);
                if (hidx & _PTEIDX_SECONDARY)