Commit fbfa26d8 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/mm/radix/hugetlb: Add helper for finding page size from hstate

Use the helper instead of open coding the same at multiple place
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent f22dfc91
...@@ -11,4 +11,19 @@ extern unsigned long ...@@ -11,4 +11,19 @@ extern unsigned long
radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr, radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
unsigned long len, unsigned long pgoff, unsigned long len, unsigned long pgoff,
unsigned long flags); unsigned long flags);
static inline int hstate_get_psize(struct hstate *hstate)
{
unsigned long shift;
shift = huge_page_shift(hstate);
if (shift == mmu_psize_defs[MMU_PAGE_2M].shift)
return MMU_PAGE_2M;
else if (shift == mmu_psize_defs[MMU_PAGE_1G].shift)
return MMU_PAGE_1G;
else {
WARN(1, "Wrong huge page shift\n");
return mmu_virtual_psize;
}
}
#endif #endif
...@@ -22,14 +22,14 @@ extern void radix__local_flush_tlb_mm(struct mm_struct *mm); ...@@ -22,14 +22,14 @@ extern void radix__local_flush_tlb_mm(struct mm_struct *mm);
extern void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); extern void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
extern void radix__local_flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr); extern void radix__local_flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr);
extern void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr, extern void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
unsigned long ap); int psize);
extern void radix__tlb_flush(struct mmu_gather *tlb); extern void radix__tlb_flush(struct mmu_gather *tlb);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern void radix__flush_tlb_mm(struct mm_struct *mm); extern void radix__flush_tlb_mm(struct mm_struct *mm);
extern void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr); extern void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr); extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr);
extern void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr, extern void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
unsigned long ap); int psize);
#else #else
#define radix__flush_tlb_mm(mm) radix__local_flush_tlb_mm(mm) #define radix__flush_tlb_mm(mm) radix__local_flush_tlb_mm(mm)
#define radix__flush_tlb_page(vma,addr) radix__local_flush_tlb_page(vma,addr) #define radix__flush_tlb_page(vma,addr) radix__local_flush_tlb_page(vma,addr)
......
...@@ -5,39 +5,24 @@ ...@@ -5,39 +5,24 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/mman.h> #include <asm/mman.h>
#include <asm/tlb.h>
void radix__flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr) void radix__flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
{ {
unsigned long ap, shift; int psize;
struct hstate *hstate = hstate_file(vma->vm_file); struct hstate *hstate = hstate_file(vma->vm_file);
shift = huge_page_shift(hstate); psize = hstate_get_psize(hstate);
if (shift == mmu_psize_defs[MMU_PAGE_2M].shift) radix__flush_tlb_page_psize(vma->vm_mm, vmaddr, psize);
ap = mmu_get_ap(MMU_PAGE_2M);
else if (shift == mmu_psize_defs[MMU_PAGE_1G].shift)
ap = mmu_get_ap(MMU_PAGE_1G);
else {
WARN(1, "Wrong huge page shift\n");
return ;
}
radix__flush_tlb_page_psize(vma->vm_mm, vmaddr, ap);
} }
void radix__local_flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr) void radix__local_flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
{ {
unsigned long ap, shift; int psize;
struct hstate *hstate = hstate_file(vma->vm_file); struct hstate *hstate = hstate_file(vma->vm_file);
shift = huge_page_shift(hstate); psize = hstate_get_psize(hstate);
if (shift == mmu_psize_defs[MMU_PAGE_2M].shift) radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, psize);
ap = mmu_get_ap(MMU_PAGE_2M);
else if (shift == mmu_psize_defs[MMU_PAGE_1G].shift)
ap = mmu_get_ap(MMU_PAGE_1G);
else {
WARN(1, "Wrong huge page shift\n");
return ;
}
radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, ap);
} }
/* /*
......
...@@ -141,9 +141,10 @@ void radix__local_flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr) ...@@ -141,9 +141,10 @@ void radix__local_flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr)
EXPORT_SYMBOL(radix__local_flush_tlb_pwc); EXPORT_SYMBOL(radix__local_flush_tlb_pwc);
void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr, void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
unsigned long ap) int psize)
{ {
unsigned long pid; unsigned long pid;
unsigned long ap = mmu_get_ap(psize);
preempt_disable(); preempt_disable();
pid = mm ? mm->context.id : 0; pid = mm ? mm->context.id : 0;
...@@ -160,7 +161,7 @@ void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmadd ...@@ -160,7 +161,7 @@ void radix__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmadd
return __local_flush_hugetlb_page(vma, vmaddr); return __local_flush_hugetlb_page(vma, vmaddr);
#endif #endif
radix__local_flush_tlb_page_psize(vma ? vma->vm_mm : NULL, vmaddr, radix__local_flush_tlb_page_psize(vma ? vma->vm_mm : NULL, vmaddr,
mmu_get_ap(mmu_virtual_psize)); mmu_virtual_psize);
} }
EXPORT_SYMBOL(radix__local_flush_tlb_page); EXPORT_SYMBOL(radix__local_flush_tlb_page);
...@@ -216,9 +217,10 @@ void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr) ...@@ -216,9 +217,10 @@ void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr)
EXPORT_SYMBOL(radix__flush_tlb_pwc); EXPORT_SYMBOL(radix__flush_tlb_pwc);
void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr, void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
unsigned long ap) int psize)
{ {
unsigned long pid; unsigned long pid;
unsigned long ap = mmu_get_ap(psize);
preempt_disable(); preempt_disable();
pid = mm ? mm->context.id : 0; pid = mm ? mm->context.id : 0;
...@@ -245,7 +247,7 @@ void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr) ...@@ -245,7 +247,7 @@ void radix__flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
return flush_hugetlb_page(vma, vmaddr); return flush_hugetlb_page(vma, vmaddr);
#endif #endif
radix__flush_tlb_page_psize(vma ? vma->vm_mm : NULL, vmaddr, radix__flush_tlb_page_psize(vma ? vma->vm_mm : NULL, vmaddr,
mmu_get_ap(mmu_virtual_psize)); mmu_virtual_psize);
} }
EXPORT_SYMBOL(radix__flush_tlb_page); EXPORT_SYMBOL(radix__flush_tlb_page);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment