diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2015-02-27 09:06:35 -0500 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2015-10-17 08:18:21 -0400 |
commit | 722fe8fd365a08bd53e9dd105009ab810107b02d (patch) | |
tree | 4077fb1d215b61bc53e3b5a5a34ea584c92ceac3 /arch/arc/mm/tlb.c | |
parent | 12ebc1581ad114543ae822aa3a12f76072e2f902 (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.c | 20 |
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 | ||
662 | void 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 |