mirror of https://gitee.com/openkylin/linux.git
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: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
f22dfc9158
commit
fbfa26d854
|
@ -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);
|
||||||
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 @@
|
||||||
#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)
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue