On 09/04/2022, 19:17:34, Christophe Leroy wrote: > hugetlb_get_unmapped_area() is now identical to the > generic version if only RADIX is enabled, so move it > to slice.c and let it fallback on the generic one > when HASH MMU is not compiled in. > > Do the same with arch_get_unmapped_area() and > arch_get_unmapped_area_topdown(). This breaks the build when CONFIG_PPC_64S_HASH_MMU is not set. The root cause is that arch/powerpc/mm/book3s64/slice.c is not built if !CONFIG_PPC_64S_HASH_MMU. The commit f693d38d9468 (powerpc/mm: Remove CONFIG_PPC_MM_SLICES, 2022-04-09) builds slice.c only if CONFIG_PPC_64S_HASH_MMU. I'm wondering if these functions have to be moved in slice.c Attached is the config file I used. > Signed-off-by: Christophe Leroy > --- > arch/powerpc/include/asm/book3s/64/mmu.h | 6 ---- > arch/powerpc/include/asm/book3s/64/slice.h | 6 ++++ > arch/powerpc/mm/book3s64/slice.c | 42 ++++++++++++++++++++++ > arch/powerpc/mm/hugetlbpage.c | 21 ----------- > arch/powerpc/mm/mmap.c | 36 ------------------- > 5 files changed, 48 insertions(+), 63 deletions(-) > > diff --git a/arch/powerpc/include/asm/book3s/64/mmu.h b/arch/powerpc/include/asm/book3s/64/mmu.h > index 006cbec70ffe..570a4960cf17 100644 > --- a/arch/powerpc/include/asm/book3s/64/mmu.h > +++ b/arch/powerpc/include/asm/book3s/64/mmu.h > @@ -4,12 +4,6 @@ > > #include > > -#ifdef CONFIG_HUGETLB_PAGE > -#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA > -#endif > -#define HAVE_ARCH_UNMAPPED_AREA > -#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN > - > #ifndef __ASSEMBLY__ > /* > * Page size definition > diff --git a/arch/powerpc/include/asm/book3s/64/slice.h b/arch/powerpc/include/asm/book3s/64/slice.h > index 5b0f7105bc8b..b8eb4ad271b9 100644 > --- a/arch/powerpc/include/asm/book3s/64/slice.h > +++ b/arch/powerpc/include/asm/book3s/64/slice.h > @@ -4,6 +4,12 @@ > > #ifndef __ASSEMBLY__ > > +#ifdef CONFIG_HUGETLB_PAGE > +#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA > +#endif > +#define HAVE_ARCH_UNMAPPED_AREA > +#define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN > + > #define SLICE_LOW_SHIFT 28 > #define SLICE_LOW_TOP (0x100000000ul) > #define SLICE_NUM_LOW (SLICE_LOW_TOP >> SLICE_LOW_SHIFT) > diff --git a/arch/powerpc/mm/book3s64/slice.c b/arch/powerpc/mm/book3s64/slice.c > index e4382713746d..03681042b807 100644 > --- a/arch/powerpc/mm/book3s64/slice.c > +++ b/arch/powerpc/mm/book3s64/slice.c > @@ -639,6 +639,32 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len, > } > EXPORT_SYMBOL_GPL(slice_get_unmapped_area); > > +unsigned long arch_get_unmapped_area(struct file *filp, > + unsigned long addr, > + unsigned long len, > + unsigned long pgoff, > + unsigned long flags) > +{ > + if (radix_enabled()) > + return generic_get_unmapped_area(filp, addr, len, pgoff, flags); > + > + return slice_get_unmapped_area(addr, len, flags, > + mm_ctx_user_psize(¤t->mm->context), 0); > +} > + > +unsigned long arch_get_unmapped_area_topdown(struct file *filp, > + const unsigned long addr0, > + const unsigned long len, > + const unsigned long pgoff, > + const unsigned long flags) > +{ > + if (radix_enabled()) > + return generic_get_unmapped_area_topdown(filp, addr0, len, pgoff, flags); > + > + return slice_get_unmapped_area(addr0, len, flags, > + mm_ctx_user_psize(¤t->mm->context), 1); > +} > + > unsigned int notrace get_slice_psize(struct mm_struct *mm, unsigned long addr) > { > unsigned char *psizes; > @@ -766,4 +792,20 @@ unsigned long vma_mmu_pagesize(struct vm_area_struct *vma) > > return 1UL << mmu_psize_to_shift(get_slice_psize(vma->vm_mm, vma->vm_start)); > } > + > +static int file_to_psize(struct file *file) > +{ > + struct hstate *hstate = hstate_file(file); > + return shift_to_mmu_psize(huge_page_shift(hstate)); > +} > + > +unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > + unsigned long len, unsigned long pgoff, > + unsigned long flags) > +{ > + if (radix_enabled()) > + return generic_hugetlb_get_unmapped_area(file, addr, len, pgoff, flags); > + > + return slice_get_unmapped_area(addr, len, flags, file_to_psize(file), 1); > +} > #endif > diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c > index a87c886042e9..b282af39fcf6 100644 > --- a/arch/powerpc/mm/hugetlbpage.c > +++ b/arch/powerpc/mm/hugetlbpage.c > @@ -542,27 +542,6 @@ struct page *follow_huge_pd(struct vm_area_struct *vma, > return page; > } > > -#ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA > -static inline int file_to_psize(struct file *file) > -{ > - struct hstate *hstate = hstate_file(file); > - return shift_to_mmu_psize(huge_page_shift(hstate)); > -} > - > -unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, > - unsigned long len, unsigned long pgoff, > - unsigned long flags) > -{ > - if (radix_enabled()) > - return generic_hugetlb_get_unmapped_area(file, addr, len, > - pgoff, flags); > -#ifdef CONFIG_PPC_64S_HASH_MMU > - return slice_get_unmapped_area(addr, len, flags, file_to_psize(file), 1); > -#endif > - BUG(); > -} > -#endif > - > bool __init arch_hugetlb_valid_size(unsigned long size) > { > int shift = __ffs(size); > diff --git a/arch/powerpc/mm/mmap.c b/arch/powerpc/mm/mmap.c > index 46781d0103d1..5972d619d274 100644 > --- a/arch/powerpc/mm/mmap.c > +++ b/arch/powerpc/mm/mmap.c > @@ -80,42 +80,6 @@ static inline unsigned long mmap_base(unsigned long rnd, > return PAGE_ALIGN(DEFAULT_MAP_WINDOW - gap - rnd); > } > > -#ifdef HAVE_ARCH_UNMAPPED_AREA > -unsigned long arch_get_unmapped_area(struct file *filp, > - unsigned long addr, > - unsigned long len, > - unsigned long pgoff, > - unsigned long flags) > -{ > - if (radix_enabled()) > - return generic_get_unmapped_area(filp, addr, len, pgoff, flags); > - > -#ifdef CONFIG_PPC_64S_HASH_MMU > - return slice_get_unmapped_area(addr, len, flags, > - mm_ctx_user_psize(¤t->mm->context), 0); > -#else > - BUG(); > -#endif > -} > - > -unsigned long arch_get_unmapped_area_topdown(struct file *filp, > - const unsigned long addr0, > - const unsigned long len, > - const unsigned long pgoff, > - const unsigned long flags) > -{ > - if (radix_enabled()) > - return generic_get_unmapped_area_topdown(filp, addr0, len, pgoff, flags); > - > -#ifdef CONFIG_PPC_64S_HASH_MMU > - return slice_get_unmapped_area(addr0, len, flags, > - mm_ctx_user_psize(¤t->mm->context), 1); > -#else > - BUG(); > -#endif > -} > -#endif /* HAVE_ARCH_UNMAPPED_AREA */ > - > /* > * This function, called very early during the creation of a new > * process VM image, sets up which VM layout function to use: