aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2016-07-13 05:36:43 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-07-31 21:15:13 -0400
commit5491ae7b6f48499b8892822cff371746f0b4102f (patch)
treea8bb6c61ba9276e1b64d4ad2ef1b6c10b8508929 /arch/powerpc
parentfbfa26d85418a155feacdb0f73cbf938f1027a8c (diff)
powerpc/mm/hugetlb: Add flush_hugetlb_tlb_range
Some archs like ppc64 need to do special things when flushing tlb for hugepage. Add a new helper to flush hugetlb tlb range. This helps us to avoid flushing the entire tlb mapping for the pid. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/include/asm/book3s/64/tlbflush-radix.h2
-rw-r--r--arch/powerpc/include/asm/book3s/64/tlbflush.h10
-rw-r--r--arch/powerpc/mm/hugetlbpage-radix.c10
3 files changed, 22 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h b/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h
index 10eb0d1e3140..65037762b120 100644
--- a/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h
+++ b/arch/powerpc/include/asm/book3s/64/tlbflush-radix.h
@@ -10,6 +10,8 @@ static inline int mmu_get_ap(int psize)
10 return mmu_psize_defs[psize].ap; 10 return mmu_psize_defs[psize].ap;
11} 11}
12 12
13extern void radix__flush_hugetlb_tlb_range(struct vm_area_struct *vma,
14 unsigned long start, unsigned long end);
13extern void radix__flush_tlb_range_psize(struct mm_struct *mm, unsigned long start, 15extern void radix__flush_tlb_range_psize(struct mm_struct *mm, unsigned long start,
14 unsigned long end, int psize); 16 unsigned long end, int psize);
15extern void radix__flush_pmd_tlb_range(struct vm_area_struct *vma, 17extern void radix__flush_pmd_tlb_range(struct vm_area_struct *vma,
diff --git a/arch/powerpc/include/asm/book3s/64/tlbflush.h b/arch/powerpc/include/asm/book3s/64/tlbflush.h
index 0790c4e92a64..146b269de8fa 100644
--- a/arch/powerpc/include/asm/book3s/64/tlbflush.h
+++ b/arch/powerpc/include/asm/book3s/64/tlbflush.h
@@ -16,6 +16,16 @@ static inline void flush_pmd_tlb_range(struct vm_area_struct *vma,
16 return hash__flush_tlb_range(vma, start, end); 16 return hash__flush_tlb_range(vma, start, end);
17} 17}
18 18
19#define __HAVE_ARCH_FLUSH_HUGETLB_TLB_RANGE
20static inline void flush_hugetlb_tlb_range(struct vm_area_struct *vma,
21 unsigned long start,
22 unsigned long end)
23{
24 if (radix_enabled())
25 return radix__flush_hugetlb_tlb_range(vma, start, end);
26 return hash__flush_tlb_range(vma, start, end);
27}
28
19static inline void flush_tlb_range(struct vm_area_struct *vma, 29static inline void flush_tlb_range(struct vm_area_struct *vma,
20 unsigned long start, unsigned long end) 30 unsigned long start, unsigned long end)
21{ 31{
diff --git a/arch/powerpc/mm/hugetlbpage-radix.c b/arch/powerpc/mm/hugetlbpage-radix.c
index 1eca0deaf89b..35254a678456 100644
--- a/arch/powerpc/mm/hugetlbpage-radix.c
+++ b/arch/powerpc/mm/hugetlbpage-radix.c
@@ -25,6 +25,16 @@ void radix__local_flush_hugetlb_page(struct vm_area_struct *vma, unsigned long v
25 radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, psize); 25 radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, psize);
26} 26}
27 27
28void radix__flush_hugetlb_tlb_range(struct vm_area_struct *vma, unsigned long start,
29 unsigned long end)
30{
31 int psize;
32 struct hstate *hstate = hstate_file(vma->vm_file);
33
34 psize = hstate_get_psize(hstate);
35 radix__flush_tlb_range_psize(vma->vm_mm, start, end, psize);
36}
37
28/* 38/*
29 * A vairant of hugetlb_get_unmapped_area doing topdown search 39 * A vairant of hugetlb_get_unmapped_area doing topdown search
30 * FIXME!! should we do as x86 does or non hugetlb area does ? 40 * FIXME!! should we do as x86 does or non hugetlb area does ?