]> rtime.felk.cvut.cz Git - linux-imx.git/blobdiff - arch/powerpc/mm/pgtable_64.c
powerpc: Optimize hugepage invalidate
[linux-imx.git] / arch / powerpc / mm / pgtable_64.c
index 074a4a2250543e71cc0b0b11c356b8b6c5e2edbb..536eec72c0f701584b717b86189d039442c54acb 100644 (file)
@@ -708,6 +708,7 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
 {
        int ssize, i;
        unsigned long s_addr;
+       int max_hpte_count;
        unsigned int psize, valid;
        unsigned char *hpte_slot_array;
        unsigned long hidx, vpn, vsid, hash, shift, slot;
@@ -727,9 +728,16 @@ void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
 
        /* get the base page size */
        psize = get_slice_psize(mm, s_addr);
-       shift = mmu_psize_defs[psize].shift;
 
-       for (i = 0; i < (HPAGE_PMD_SIZE >> shift); i++) {
+       if (ppc_md.hugepage_invalidate)
+               return ppc_md.hugepage_invalidate(mm, hpte_slot_array,
+                                                 s_addr, psize);
+       /*
+        * No bluk hpte removal support, invalidate each entry
+        */
+       shift = mmu_psize_defs[psize].shift;
+       max_hpte_count = HPAGE_PMD_SIZE >> shift;
+       for (i = 0; i < max_hpte_count; i++) {
                /*
                 * 8 bits per each hpte entries
                 * 000| [ secondary group (one bit) | hidx (3 bits) | valid bit]