mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-06 14:05:39 +00:00
arch/powerpc: teach book3s64 arch_get_unmapped_area{_topdown} to handle hugetlb mappings
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>
This commit is contained in:
parent
a8d457b29b
commit
5959ffabbb
@ -633,6 +633,20 @@ unsigned long slice_get_unmapped_area(unsigned long addr, unsigned long len,
|
||||
}
|
||||
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(¤t->mm->context), 0);
|
||||
if (filp && is_file_hugepages(filp))
|
||||
psize = file_to_psize(filp);
|
||||
else
|
||||
psize = mm_ctx_user_psize(¤t->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(¤t->mm->context), 1);
|
||||
if (filp && is_file_hugepages(filp))
|
||||
psize = file_to_psize(filp);
|
||||
else
|
||||
psize = mm_ctx_user_psize(¤t->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)
|
||||
|
Loading…
Reference in New Issue
Block a user