diff options
author | Christophe Leroy <christophe.leroy@csgroup.eu> | 2020-10-22 08:29:38 +0200 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2020-12-09 06:46:56 +0100 |
commit | 91ec450f8d8c1e599a943c526ab1d2a4acf73c22 (patch) | |
tree | 7f200a43a3423bae043628c74da48ddfd33807d8 /arch/powerpc/mm/book3s32 | |
parent | powerpc/32s: Inline flush_tlb_range() and flush_tlb_kernel_range() (diff) | |
download | linux-91ec450f8d8c1e599a943c526ab1d2a4acf73c22.tar.xz linux-91ec450f8d8c1e599a943c526ab1d2a4acf73c22.zip |
powerpc/32s: Split and inline flush_range()
flush_range() handle both the MMU_FTR_HPTE_TABLE case and
the other case.
The non MMU_FTR_HPTE_TABLE case is trivial as it is only a call
to _tlbie()/_tlbia() which is not worth a dedicated function.
Make flush_range() a hash specific and call it from tlbflush.h based
on mmu_has_feature(MMU_FTR_HPTE_TABLE).
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/132ab19aae52abc8e06ab524ec86d4229b5b9c3d.1603348103.git.christophe.leroy@csgroup.eu
Diffstat (limited to 'arch/powerpc/mm/book3s32')
-rw-r--r-- | arch/powerpc/mm/book3s32/tlb.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/arch/powerpc/mm/book3s32/tlb.c b/arch/powerpc/mm/book3s32/tlb.c index f9b8e1ce4371..f0edbad5966c 100644 --- a/arch/powerpc/mm/book3s32/tlb.c +++ b/arch/powerpc/mm/book3s32/tlb.c @@ -76,7 +76,7 @@ void tlb_flush(struct mmu_gather *tlb) * and check _PAGE_HASHPTE bit; if it is set, find and destroy * the corresponding HPTE. */ -void flush_range(struct mm_struct *mm, unsigned long start, unsigned long end) +void hash__flush_range(struct mm_struct *mm, unsigned long start, unsigned long end) { pmd_t *pmd; unsigned long pmd_end; @@ -84,13 +84,6 @@ void flush_range(struct mm_struct *mm, unsigned long start, unsigned long end) unsigned int ctx = mm->context.id; start &= PAGE_MASK; - if (!mmu_has_feature(MMU_FTR_HPTE_TABLE)) { - if (end - start <= PAGE_SIZE) - _tlbie(start); - else - _tlbia(); - return; - } if (start >= end) return; end = (end - 1) | ~PAGE_MASK; @@ -109,7 +102,7 @@ void flush_range(struct mm_struct *mm, unsigned long start, unsigned long end) ++pmd; } } -EXPORT_SYMBOL(flush_range); +EXPORT_SYMBOL(hash__flush_range); /* * Flush all the (user) entries for the address space described by mm. @@ -125,7 +118,7 @@ void hash__flush_tlb_mm(struct mm_struct *mm) * but it seems dup_mmap is the only SMP case which gets here. */ for (mp = mm->mmap; mp != NULL; mp = mp->vm_next) - flush_range(mp->vm_mm, mp->vm_start, mp->vm_end); + hash__flush_range(mp->vm_mm, mp->vm_start, mp->vm_end); } EXPORT_SYMBOL(hash__flush_tlb_mm); |