ARCv2: mm: THP: Implement flush_pmd_tlb_range() optimization
authorVineet Gupta <vgupta@synopsys.com>
Fri, 27 Feb 2015 14:06:35 +0000 (19:36 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Sat, 17 Oct 2015 12:18:21 +0000 (17:48 +0530)
Implement the TLB flush routine to evict a sepcific Super TLB entry,
vs. moving to a new ASID on every such flush.

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/hugepage.h
arch/arc/mm/tlb.c

index 1d0700c32b821d111b5ee2f48146132d9ea92d52..c5094de86403be046ce70f6d10777aa13918ceed 100644 (file)
@@ -74,4 +74,8 @@ extern void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,
 #define __HAVE_ARCH_PGTABLE_WITHDRAW
 extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
 
+#define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE
+extern void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
+                               unsigned long end);
+
 #endif
index 91905b1c3d7260371ad525a4f197fd372617d030..005090e425f4f83025ede741b74df8a99b8cfc94 100644 (file)
@@ -659,6 +659,26 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
        return pgtable;
 }
 
+void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
+                        unsigned long end)
+{
+       unsigned int cpu;
+       unsigned long flags;
+
+       local_irq_save(flags);
+
+       cpu = smp_processor_id();
+
+       if (likely(asid_mm(vma->vm_mm, cpu) != MM_CTXT_NO_ASID)) {
+               unsigned int asid = hw_pid(vma->vm_mm, cpu);
+
+               /* No need to loop here: this will always be for 1 Huge Page */
+               tlb_entry_erase(start | _PAGE_HW_SZ | asid);
+       }
+
+       local_irq_restore(flags);
+}
+
 #endif
 
 /* Read the Cache Build Confuration Registers, Decode them and save into