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,
 | 
			
		||||
				unsigned long len, unsigned long pgoff,
 | 
			
		||||
				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
 | 
			
		||||
 | 
			
		||||
@ -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_pwc(struct mmu_gather *tlb, unsigned long addr);
 | 
			
		||||
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);
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
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_pwc(struct mmu_gather *tlb, unsigned long addr);
 | 
			
		||||
extern void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
 | 
			
		||||
					unsigned long ap);
 | 
			
		||||
					int psize);
 | 
			
		||||
#else
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
@ -5,39 +5,24 @@
 | 
			
		||||
#include <asm/cacheflush.h>
 | 
			
		||||
#include <asm/machdep.h>
 | 
			
		||||
#include <asm/mman.h>
 | 
			
		||||
#include <asm/tlb.h>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
	shift = huge_page_shift(hstate);
 | 
			
		||||
	if (shift == mmu_psize_defs[MMU_PAGE_2M].shift)
 | 
			
		||||
		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);
 | 
			
		||||
	psize = hstate_get_psize(hstate);
 | 
			
		||||
	radix__flush_tlb_page_psize(vma->vm_mm, vmaddr, psize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
	shift = huge_page_shift(hstate);
 | 
			
		||||
	if (shift == mmu_psize_defs[MMU_PAGE_2M].shift)
 | 
			
		||||
		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);
 | 
			
		||||
	psize = hstate_get_psize(hstate);
 | 
			
		||||
	radix__local_flush_tlb_page_psize(vma->vm_mm, vmaddr, psize);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
@ -141,9 +141,10 @@ void radix__local_flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr)
 | 
			
		||||
EXPORT_SYMBOL(radix__local_flush_tlb_pwc);
 | 
			
		||||
 | 
			
		||||
void radix__local_flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
 | 
			
		||||
				       unsigned long ap)
 | 
			
		||||
				       int psize)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long pid;
 | 
			
		||||
	unsigned long ap = mmu_get_ap(psize);
 | 
			
		||||
 | 
			
		||||
	preempt_disable();
 | 
			
		||||
	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);
 | 
			
		||||
#endif
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
@ -216,9 +217,10 @@ no_context:
 | 
			
		||||
EXPORT_SYMBOL(radix__flush_tlb_pwc);
 | 
			
		||||
 | 
			
		||||
void radix__flush_tlb_page_psize(struct mm_struct *mm, unsigned long vmaddr,
 | 
			
		||||
				 unsigned long ap)
 | 
			
		||||
				 int psize)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long pid;
 | 
			
		||||
	unsigned long ap = mmu_get_ap(psize);
 | 
			
		||||
 | 
			
		||||
	preempt_disable();
 | 
			
		||||
	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);
 | 
			
		||||
#endif
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user