aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc/mm/tlb.c
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2015-02-27 09:06:35 -0500
committerVineet Gupta <vgupta@synopsys.com>2015-10-17 08:18:21 -0400
commit722fe8fd365a08bd53e9dd105009ab810107b02d (patch)
tree4077fb1d215b61bc53e3b5a5a34ea584c92ceac3 /arch/arc/mm/tlb.c
parent12ebc1581ad114543ae822aa3a12f76072e2f902 (diff)
ARCv2: mm: THP: Implement flush_pmd_tlb_range() optimization
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>
Diffstat (limited to 'arch/arc/mm/tlb.c')
-rw-r--r--arch/arc/mm/tlb.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/arch/arc/mm/tlb.c b/arch/arc/mm/tlb.c
index 91905b1c3d72..005090e425f4 100644
--- a/arch/arc/mm/tlb.c
+++ b/arch/arc/mm/tlb.c
@@ -659,6 +659,26 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
659 return pgtable; 659 return pgtable;
660} 660}
661 661
662void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
663 unsigned long end)
664{
665 unsigned int cpu;
666 unsigned long flags;
667
668 local_irq_save(flags);
669
670 cpu = smp_processor_id();
671
672 if (likely(asid_mm(vma->vm_mm, cpu) != MM_CTXT_NO_ASID)) {
673 unsigned int asid = hw_pid(vma->vm_mm, cpu);
674
675 /* No need to loop here: this will always be for 1 Huge Page */
676 tlb_entry_erase(start | _PAGE_HW_SZ | asid);
677 }
678
679 local_irq_restore(flags);
680}
681
662#endif 682#endif
663 683
664/* Read the Cache Build Confuration Registers, Decode them and save into 684/* Read the Cache Build Confuration Registers, Decode them and save into