Le 23/05/2022 à 14:27, Laurent Dufour a écrit : > 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 think the root cause is slice.h is being included allthough !CONFIG_PPC_64S_HASH_MMU, which leads to HAVE_ARCH_UNMAPPED_AREA and HAVE_ARCH_UNMAPPED_AREA_TOPDOWN being defined while they shouldn't Wondering why I didn't see that before. slice.h gets included via asm/book3s/64/mmu-hash.h I was able to build microwatt_defconfig with the following changes: diff --git a/arch/powerpc/include/asm/book3s/64/slice.h b/arch/powerpc/include/asm/book3s/64/slice.h index b8eb4ad271b9..5fbe18544cbd 100644 --- a/arch/powerpc/include/asm/book3s/64/slice.h +++ b/arch/powerpc/include/asm/book3s/64/slice.h @@ -4,11 +4,13 @@ #ifndef __ASSEMBLY__ +#ifdef CONFIG_PPC_64S_HASH_MMU #ifdef CONFIG_HUGETLB_PAGE #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA #endif #define HAVE_ARCH_UNMAPPED_AREA #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN +#endif #define SLICE_LOW_SHIFT 28 #define SLICE_LOW_TOP (0x100000000ul) diff --git a/arch/powerpc/sysdev/xics/ics-native.c b/arch/powerpc/sysdev/xics/ics-native.c index e33b77da861e..112c8a1e8159 100644 --- a/arch/powerpc/sysdev/xics/ics-native.c +++ b/arch/powerpc/sysdev/xics/ics-native.c @@ -15,6 +15,7 @@ #include <linux/init.h> #include <linux/cpu.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/spinlock.h> #include <linux/msi.h> #include <linux/list.h> > > 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 <christophe.leroy@xxxxxxxxxx> >> --- >> 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 <asm/page.h> >> >> -#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: