powerpc/mm: Use generic_hugetlb_get_unmapped_area()
Use the generic version of arch_hugetlb_get_unmapped_area() which is now available at all time. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/05f77014c619061638ecc52a0a4136eb04cc2799.1649523076.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
76a345ed16
commit
1a0261fd3b
@ -8,10 +8,6 @@
|
||||
*/
|
||||
void radix__flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
|
||||
void radix__local_flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
|
||||
extern unsigned long
|
||||
radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff,
|
||||
unsigned long flags);
|
||||
|
||||
extern void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep,
|
||||
|
@ -41,61 +41,6 @@ void radix__flush_hugetlb_tlb_range(struct vm_area_struct *vma, unsigned long st
|
||||
radix__flush_tlb_range_psize(vma->vm_mm, start, end, psize);
|
||||
}
|
||||
|
||||
/*
|
||||
* A vairant of hugetlb_get_unmapped_area doing topdown search
|
||||
* FIXME!! should we do as x86 does or non hugetlb area does ?
|
||||
* ie, use topdown or not based on mmap_is_legacy check ?
|
||||
*/
|
||||
unsigned long
|
||||
radix__hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff,
|
||||
unsigned long flags)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
struct hstate *h = hstate_file(file);
|
||||
int fixed = (flags & MAP_FIXED);
|
||||
unsigned long high_limit;
|
||||
struct vm_unmapped_area_info info;
|
||||
|
||||
high_limit = DEFAULT_MAP_WINDOW;
|
||||
if (addr >= high_limit || (fixed && (addr + len > high_limit)))
|
||||
high_limit = TASK_SIZE;
|
||||
|
||||
if (len & ~huge_page_mask(h))
|
||||
return -EINVAL;
|
||||
if (len > high_limit)
|
||||
return -ENOMEM;
|
||||
|
||||
if (fixed) {
|
||||
if (addr > high_limit - len)
|
||||
return -ENOMEM;
|
||||
if (prepare_hugepage_range(file, addr, len))
|
||||
return -EINVAL;
|
||||
return addr;
|
||||
}
|
||||
|
||||
if (addr) {
|
||||
addr = ALIGN(addr, huge_page_size(h));
|
||||
vma = find_vma(mm, addr);
|
||||
if (high_limit - len >= addr && addr >= mmap_min_addr &&
|
||||
(!vma || addr + len <= vm_start_gap(vma)))
|
||||
return addr;
|
||||
}
|
||||
/*
|
||||
* We are always doing an topdown search here. Slice code
|
||||
* does that too.
|
||||
*/
|
||||
info.flags = VM_UNMAPPED_AREA_TOPDOWN;
|
||||
info.length = len;
|
||||
info.low_limit = max(PAGE_SIZE, mmap_min_addr);
|
||||
info.high_limit = mm->mmap_base + (high_limit - DEFAULT_MAP_WINDOW);
|
||||
info.align_mask = PAGE_MASK & ~huge_page_mask(h);
|
||||
info.align_offset = 0;
|
||||
|
||||
return vm_unmapped_area(&info);
|
||||
}
|
||||
|
||||
void radix__huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep,
|
||||
pte_t old_pte, pte_t pte)
|
||||
|
@ -553,11 +553,9 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
|
||||
unsigned long len, unsigned long pgoff,
|
||||
unsigned long flags)
|
||||
{
|
||||
#ifdef CONFIG_PPC_RADIX_MMU
|
||||
if (radix_enabled())
|
||||
return radix__hugetlb_get_unmapped_area(file, addr, len,
|
||||
return generic_hugetlb_get_unmapped_area(file, addr, len,
|
||||
pgoff, flags);
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_64S_HASH_MMU
|
||||
return slice_get_unmapped_area(addr, len, flags, file_to_psize(file), 1);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user