]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
arch/powerpc: teach book3s64 arch_get_unmapped_area{_topdown} to handle hugetlb mappings
authorOscar Salvador <osalvador@suse.de>
Mon, 7 Oct 2024 07:50:33 +0000 (09:50 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 1 Nov 2024 04:28:59 +0000 (21:28 -0700)
We want to stop special casing hugetlb mappings and make them go through
generic channels, so teach arch_get_unmapped_area{_topdown} to handle
those.

Reshuffle file_to_psize() definition so arch_get_unmapped_area{_topdown}
can make use of it.

Link: https://lkml.kernel.org/r/20241007075037.267650-6-osalvador@suse.de
Signed-off-by: Oscar Salvador <osalvador@suse.de>
Cc: David Hildenbrand <david@redhat.com>
Cc: Donet Tom <donettom@linux.ibm.com>
Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Peter Xu <peterx@redhat.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/powerpc/mm/book3s64/slice.c

index 87307d0fc3b81367f74879d2ec075cc95a6afbba..3a858f6b727012c5e16f77a478e5bbd85ed2d63f 100644 (file)
@@ -633,6 +633,20 @@ return_addr:
 }
 EXPORT_SYMBOL_GPL(slice_get_unmapped_area);
 
+#ifdef CONFIG_HUGETLB_PAGE
+static int file_to_psize(struct file *file)
+{
+       struct hstate *hstate = hstate_file(file);
+
+       return shift_to_mmu_psize(huge_page_shift(hstate));
+}
+#else
+static int file_to_psize(struct file *file)
+{
+       return 0;
+}
+#endif
+
 unsigned long arch_get_unmapped_area(struct file *filp,
                                     unsigned long addr,
                                     unsigned long len,
@@ -640,11 +654,17 @@ unsigned long arch_get_unmapped_area(struct file *filp,
                                     unsigned long flags,
                                     vm_flags_t vm_flags)
 {
+       unsigned int psize;
+
        if (radix_enabled())
                return generic_get_unmapped_area(filp, addr, len, pgoff, flags, vm_flags);
 
-       return slice_get_unmapped_area(addr, len, flags,
-                                      mm_ctx_user_psize(&current->mm->context), 0);
+       if (filp && is_file_hugepages(filp))
+               psize = file_to_psize(filp);
+       else
+               psize = mm_ctx_user_psize(&current->mm->context);
+
+       return slice_get_unmapped_area(addr, len, flags, psize, 0);
 }
 
 unsigned long arch_get_unmapped_area_topdown(struct file *filp,
@@ -654,11 +674,17 @@ unsigned long arch_get_unmapped_area_topdown(struct file *filp,
                                             const unsigned long flags,
                                             vm_flags_t vm_flags)
 {
+       unsigned int psize;
+
        if (radix_enabled())
                return generic_get_unmapped_area_topdown(filp, addr0, len, pgoff, flags, vm_flags);
 
-       return slice_get_unmapped_area(addr0, len, flags,
-                                      mm_ctx_user_psize(&current->mm->context), 1);
+       if (filp && is_file_hugepages(filp))
+               psize = file_to_psize(filp);
+       else
+               psize = mm_ctx_user_psize(&current->mm->context);
+
+       return slice_get_unmapped_area(addr0, len, flags, psize, 1);
 }
 
 unsigned int notrace get_slice_psize(struct mm_struct *mm, unsigned long addr)
@@ -789,12 +815,6 @@ 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)