mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	powerpc/mm: cleanup ifdef mess in add_huge_page_size()
Introduce a subarch specific helper check_and_get_huge_psize() to check the huge page sizes and cleanup the ifdef mess in add_huge_page_size() Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
		
							parent
							
								
									5fb84fec46
								
							
						
					
					
						commit
						723f268f19
					
				
					 4 changed files with 44 additions and 35 deletions
				
			
		| 
						 | 
					@ -107,4 +107,31 @@ static inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
 | 
					void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int check_and_get_huge_psize(int shift)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int mmu_psize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (shift > SLICE_HIGH_SHIFT)
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mmu_psize = shift_to_mmu_psize(shift);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * We need to make sure that for different page sizes reported by
 | 
				
			||||||
 | 
						 * firmware we only add hugetlb support for page sizes that can be
 | 
				
			||||||
 | 
						 * supported by linux page table layout.
 | 
				
			||||||
 | 
						 * For now we have
 | 
				
			||||||
 | 
						 * Radix: 2M and 1G
 | 
				
			||||||
 | 
						 * Hash: 16M and 16G
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (radix_enabled()) {
 | 
				
			||||||
 | 
							if (mmu_psize != MMU_PAGE_2M && mmu_psize != MMU_PAGE_1G)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (mmu_psize != MMU_PAGE_16M && mmu_psize != MMU_PAGE_16G)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mmu_psize;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,4 +36,9 @@ static inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshi
 | 
				
			||||||
			 (pshift == PAGE_SHIFT_8M ? _PMD_PAGE_8M : _PMD_PAGE_512K));
 | 
								 (pshift == PAGE_SHIFT_8M ? _PMD_PAGE_8M : _PMD_PAGE_512K));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int check_and_get_huge_psize(int shift)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return shift_to_mmu_psize(shift);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
 | 
					#endif /* _ASM_POWERPC_NOHASH_32_HUGETLB_8XX_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,4 +34,12 @@ static inline void hugepd_populate(hugepd_t *hpdp, pte_t *new, unsigned int pshi
 | 
				
			||||||
	*hpdp = __hugepd(((unsigned long)new & ~PD_HUGE) | pshift);
 | 
						*hpdp = __hugepd(((unsigned long)new & ~PD_HUGE) | pshift);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline int check_and_get_huge_psize(int shift)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (shift & 1)	/* Not a power of 4 */
 | 
				
			||||||
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return shift_to_mmu_psize(shift);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H */
 | 
					#endif /* _ASM_POWERPC_NOHASH_HUGETLB_BOOK3E_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -549,13 +549,6 @@ unsigned long vma_mmu_pagesize(struct vm_area_struct *vma)
 | 
				
			||||||
	return vma_kernel_pagesize(vma);
 | 
						return vma_kernel_pagesize(vma);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline bool is_power_of_4(unsigned long x)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (is_power_of_2(x))
 | 
					 | 
				
			||||||
		return (__ilog2(x) % 2) ? false : true;
 | 
					 | 
				
			||||||
	return false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int __init add_huge_page_size(unsigned long long size)
 | 
					static int __init add_huge_page_size(unsigned long long size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int shift = __ffs(size);
 | 
						int shift = __ffs(size);
 | 
				
			||||||
| 
						 | 
					@ -563,36 +556,12 @@ static int __init add_huge_page_size(unsigned long long size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Check that it is a page size supported by the hardware and
 | 
						/* Check that it is a page size supported by the hardware and
 | 
				
			||||||
	 * that it fits within pagetable and slice limits. */
 | 
						 * that it fits within pagetable and slice limits. */
 | 
				
			||||||
	if (size <= PAGE_SIZE)
 | 
						if (size <= PAGE_SIZE || !is_power_of_2(size))
 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
#if defined(CONFIG_PPC_FSL_BOOK3E)
 | 
					 | 
				
			||||||
	if (!is_power_of_4(size))
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
#elif !defined(CONFIG_PPC_8xx)
 | 
					 | 
				
			||||||
	if (!is_power_of_2(size) || (shift > SLICE_HIGH_SHIFT))
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ((mmu_psize = shift_to_mmu_psize(shift)) < 0)
 | 
					 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_PPC_BOOK3S_64
 | 
						mmu_psize = check_and_get_huge_psize(size);
 | 
				
			||||||
	/*
 | 
						if (mmu_psize < 0)
 | 
				
			||||||
	 * We need to make sure that for different page sizes reported by
 | 
							return -EINVAL;
 | 
				
			||||||
	 * firmware we only add hugetlb support for page sizes that can be
 | 
					 | 
				
			||||||
	 * supported by linux page table layout.
 | 
					 | 
				
			||||||
	 * For now we have
 | 
					 | 
				
			||||||
	 * Radix: 2M and 1G
 | 
					 | 
				
			||||||
	 * Hash: 16M and 16G
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (radix_enabled()) {
 | 
					 | 
				
			||||||
		if (mmu_psize != MMU_PAGE_2M && mmu_psize != MMU_PAGE_1G)
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		if (mmu_psize != MMU_PAGE_16M && mmu_psize != MMU_PAGE_16G)
 | 
					 | 
				
			||||||
			return -EINVAL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(mmu_psize_defs[mmu_psize].shift != shift);
 | 
						BUG_ON(mmu_psize_defs[mmu_psize].shift != shift);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue