1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/hugetlb.h>
4 #include <asm/pgtable.h>
5 #include <asm/pgalloc.h>
6 #include <asm/cacheflush.h>
7 #include <asm/machdep.h>
11 void radix__flush_hugetlb_page(struct vm_area_struct
*vma
, unsigned long vmaddr
)
14 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
16 psize
= hstate_get_psize(hstate
);
17 radix__flush_tlb_page_psize(vma
->vm_mm
, vmaddr
, psize
);
20 void radix__local_flush_hugetlb_page(struct vm_area_struct
*vma
, unsigned long vmaddr
)
23 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
25 psize
= hstate_get_psize(hstate
);
26 radix__local_flush_tlb_page_psize(vma
->vm_mm
, vmaddr
, psize
);
29 void radix__flush_hugetlb_tlb_range(struct vm_area_struct
*vma
, unsigned long start
,
33 struct hstate
*hstate
= hstate_file(vma
->vm_file
);
35 psize
= hstate_get_psize(hstate
);
36 radix__flush_tlb_range_psize(vma
->vm_mm
, start
, end
, psize
);
40 * A vairant of hugetlb_get_unmapped_area doing topdown search
41 * FIXME!! should we do as x86 does or non hugetlb area does ?
42 * ie, use topdown or not based on mmap_is_legacy check ?
45 radix__hugetlb_get_unmapped_area(struct file
*file
, unsigned long addr
,
46 unsigned long len
, unsigned long pgoff
,
49 struct mm_struct
*mm
= current
->mm
;
50 struct vm_area_struct
*vma
;
51 struct hstate
*h
= hstate_file(file
);
52 int fixed
= (flags
& MAP_FIXED
);
53 unsigned long high_limit
;
54 struct vm_unmapped_area_info info
;
56 high_limit
= DEFAULT_MAP_WINDOW
;
57 if (addr
>= high_limit
|| (fixed
&& (addr
+ len
> high_limit
)))
58 high_limit
= TASK_SIZE
;
60 if (len
& ~huge_page_mask(h
))
66 if (addr
> high_limit
- len
)
68 if (prepare_hugepage_range(file
, addr
, len
))
74 addr
= ALIGN(addr
, huge_page_size(h
));
75 vma
= find_vma(mm
, addr
);
76 if (high_limit
- len
>= addr
&&
77 (!vma
|| addr
+ len
<= vm_start_gap(vma
)))
81 * We are always doing an topdown search here. Slice code
84 info
.flags
= VM_UNMAPPED_AREA_TOPDOWN
;
86 info
.low_limit
= PAGE_SIZE
;
87 info
.high_limit
= mm
->mmap_base
+ (high_limit
- DEFAULT_MAP_WINDOW
);
88 info
.align_mask
= PAGE_MASK
& ~huge_page_mask(h
);
89 info
.align_offset
= 0;
91 return vm_unmapped_area(&info
);