xref: /linux/include/asm-generic/hugetlb.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2106c992aSGerald Schaefer #ifndef _ASM_GENERIC_HUGETLB_H
3106c992aSGerald Schaefer #define _ASM_GENERIC_HUGETLB_H
4106c992aSGerald Schaefer 
5679d1033SPeter Xu #include <linux/swap.h>
6679d1033SPeter Xu #include <linux/swapops.h>
7679d1033SPeter Xu 
mk_huge_pte(struct page * page,pgprot_t pgprot)8106c992aSGerald Schaefer static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot)
9106c992aSGerald Schaefer {
10106c992aSGerald Schaefer 	return mk_pte(page, pgprot);
11106c992aSGerald Schaefer }
12106c992aSGerald Schaefer 
huge_pte_write(pte_t pte)1326794942SDavid Miller static inline unsigned long huge_pte_write(pte_t pte)
14106c992aSGerald Schaefer {
15106c992aSGerald Schaefer 	return pte_write(pte);
16106c992aSGerald Schaefer }
17106c992aSGerald Schaefer 
huge_pte_dirty(pte_t pte)1826794942SDavid Miller static inline unsigned long huge_pte_dirty(pte_t pte)
19106c992aSGerald Schaefer {
20106c992aSGerald Schaefer 	return pte_dirty(pte);
21106c992aSGerald Schaefer }
22106c992aSGerald Schaefer 
huge_pte_mkwrite(pte_t pte)23106c992aSGerald Schaefer static inline pte_t huge_pte_mkwrite(pte_t pte)
24106c992aSGerald Schaefer {
252f0584f3SRick Edgecombe 	return pte_mkwrite_novma(pte);
26106c992aSGerald Schaefer }
27106c992aSGerald Schaefer 
28f1eb1bacSPeter Xu #ifndef __HAVE_ARCH_HUGE_PTE_WRPROTECT
huge_pte_wrprotect(pte_t pte)29f1eb1bacSPeter Xu static inline pte_t huge_pte_wrprotect(pte_t pte)
30f1eb1bacSPeter Xu {
31f1eb1bacSPeter Xu 	return pte_wrprotect(pte);
32f1eb1bacSPeter Xu }
33f1eb1bacSPeter Xu #endif
34f1eb1bacSPeter Xu 
huge_pte_mkdirty(pte_t pte)35106c992aSGerald Schaefer static inline pte_t huge_pte_mkdirty(pte_t pte)
36106c992aSGerald Schaefer {
37106c992aSGerald Schaefer 	return pte_mkdirty(pte);
38106c992aSGerald Schaefer }
39106c992aSGerald Schaefer 
huge_pte_modify(pte_t pte,pgprot_t newprot)40106c992aSGerald Schaefer static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot)
41106c992aSGerald Schaefer {
42106c992aSGerald Schaefer 	return pte_modify(pte, newprot);
43106c992aSGerald Schaefer }
44106c992aSGerald Schaefer 
huge_pte_mkuffd_wp(pte_t pte)45229f3fa7SPeter Xu static inline pte_t huge_pte_mkuffd_wp(pte_t pte)
46229f3fa7SPeter Xu {
47f1eb1bacSPeter Xu 	return huge_pte_wrprotect(pte_mkuffd_wp(pte));
48229f3fa7SPeter Xu }
49229f3fa7SPeter Xu 
huge_pte_clear_uffd_wp(pte_t pte)50229f3fa7SPeter Xu static inline pte_t huge_pte_clear_uffd_wp(pte_t pte)
51229f3fa7SPeter Xu {
52229f3fa7SPeter Xu 	return pte_clear_uffd_wp(pte);
53229f3fa7SPeter Xu }
54229f3fa7SPeter Xu 
huge_pte_uffd_wp(pte_t pte)55229f3fa7SPeter Xu static inline int huge_pte_uffd_wp(pte_t pte)
56229f3fa7SPeter Xu {
57229f3fa7SPeter Xu 	return pte_uffd_wp(pte);
58229f3fa7SPeter Xu }
59229f3fa7SPeter Xu 
60d018498cSAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTE_CLEAR
huge_pte_clear(struct mm_struct * mm,unsigned long addr,pte_t * ptep,unsigned long sz)61106c992aSGerald Schaefer static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
629386fac3SPunit Agrawal 		    pte_t *ptep, unsigned long sz)
63106c992aSGerald Schaefer {
64106c992aSGerald Schaefer 	pte_clear(mm, addr, ptep);
65106c992aSGerald Schaefer }
669386fac3SPunit Agrawal #endif
67106c992aSGerald Schaefer 
681e5f50fcSAlexandre Ghiti #ifndef __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
hugetlb_free_pgd_range(struct mmu_gather * tlb,unsigned long addr,unsigned long end,unsigned long floor,unsigned long ceiling)691e5f50fcSAlexandre Ghiti static inline void hugetlb_free_pgd_range(struct mmu_gather *tlb,
701e5f50fcSAlexandre Ghiti 		unsigned long addr, unsigned long end,
711e5f50fcSAlexandre Ghiti 		unsigned long floor, unsigned long ceiling)
721e5f50fcSAlexandre Ghiti {
731e5f50fcSAlexandre Ghiti 	free_pgd_range(tlb, addr, end, floor, ceiling);
741e5f50fcSAlexandre Ghiti }
75cea685d5SAlexandre Ghiti #endif
761e5f50fcSAlexandre Ghiti 
77cea685d5SAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
set_huge_pte_at(struct mm_struct * mm,unsigned long addr,pte_t * ptep,pte_t pte,unsigned long sz)78cea685d5SAlexandre Ghiti static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
79*935d4f0cSRyan Roberts 		pte_t *ptep, pte_t pte, unsigned long sz)
80cea685d5SAlexandre Ghiti {
81cea685d5SAlexandre Ghiti 	set_pte_at(mm, addr, ptep, pte);
82cea685d5SAlexandre Ghiti }
831e5f50fcSAlexandre Ghiti #endif
841e5f50fcSAlexandre Ghiti 
85a4d83853SAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
huge_ptep_get_and_clear(struct mm_struct * mm,unsigned long addr,pte_t * ptep)86a4d83853SAlexandre Ghiti static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
87a4d83853SAlexandre Ghiti 		unsigned long addr, pte_t *ptep)
88a4d83853SAlexandre Ghiti {
89a4d83853SAlexandre Ghiti 	return ptep_get_and_clear(mm, addr, ptep);
90a4d83853SAlexandre Ghiti }
91a4d83853SAlexandre Ghiti #endif
92a4d83853SAlexandre Ghiti 
93fe632225SAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
huge_ptep_clear_flush(struct vm_area_struct * vma,unsigned long addr,pte_t * ptep)94ae075629SBaolin Wang static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
95fe632225SAlexandre Ghiti 		unsigned long addr, pte_t *ptep)
96fe632225SAlexandre Ghiti {
97ae075629SBaolin Wang 	return ptep_clear_flush(vma, addr, ptep);
98fe632225SAlexandre Ghiti }
99fe632225SAlexandre Ghiti #endif
100fe632225SAlexandre Ghiti 
101cae72abcSAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTE_NONE
huge_pte_none(pte_t pte)102cae72abcSAlexandre Ghiti static inline int huge_pte_none(pte_t pte)
103cae72abcSAlexandre Ghiti {
104cae72abcSAlexandre Ghiti 	return pte_none(pte);
105cae72abcSAlexandre Ghiti }
106cae72abcSAlexandre Ghiti #endif
107cae72abcSAlexandre Ghiti 
108679d1033SPeter Xu /* Please refer to comments above pte_none_mostly() for the usage */
huge_pte_none_mostly(pte_t pte)109679d1033SPeter Xu static inline int huge_pte_none_mostly(pte_t pte)
110679d1033SPeter Xu {
111679d1033SPeter Xu 	return huge_pte_none(pte) || is_pte_marker(pte);
112679d1033SPeter Xu }
113679d1033SPeter Xu 
11478d6e4e8SAlexandre Ghiti #ifndef __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE
prepare_hugepage_range(struct file * file,unsigned long addr,unsigned long len)11578d6e4e8SAlexandre Ghiti static inline int prepare_hugepage_range(struct file *file,
11678d6e4e8SAlexandre Ghiti 		unsigned long addr, unsigned long len)
11778d6e4e8SAlexandre Ghiti {
11878d6e4e8SAlexandre Ghiti 	struct hstate *h = hstate_file(file);
11978d6e4e8SAlexandre Ghiti 
12078d6e4e8SAlexandre Ghiti 	if (len & ~huge_page_mask(h))
12178d6e4e8SAlexandre Ghiti 		return -EINVAL;
12278d6e4e8SAlexandre Ghiti 	if (addr & ~huge_page_mask(h))
12378d6e4e8SAlexandre Ghiti 		return -EINVAL;
12478d6e4e8SAlexandre Ghiti 
12578d6e4e8SAlexandre Ghiti 	return 0;
12678d6e4e8SAlexandre Ghiti }
12778d6e4e8SAlexandre Ghiti #endif
12878d6e4e8SAlexandre Ghiti 
1298e581d43SAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
huge_ptep_set_wrprotect(struct mm_struct * mm,unsigned long addr,pte_t * ptep)1308e581d43SAlexandre Ghiti static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
1318e581d43SAlexandre Ghiti 		unsigned long addr, pte_t *ptep)
1328e581d43SAlexandre Ghiti {
1338e581d43SAlexandre Ghiti 	ptep_set_wrprotect(mm, addr, ptep);
1348e581d43SAlexandre Ghiti }
1358e581d43SAlexandre Ghiti #endif
1368e581d43SAlexandre Ghiti 
137facf6d5bSAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
huge_ptep_set_access_flags(struct vm_area_struct * vma,unsigned long addr,pte_t * ptep,pte_t pte,int dirty)138facf6d5bSAlexandre Ghiti static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
139facf6d5bSAlexandre Ghiti 		unsigned long addr, pte_t *ptep,
140facf6d5bSAlexandre Ghiti 		pte_t pte, int dirty)
141facf6d5bSAlexandre Ghiti {
142facf6d5bSAlexandre Ghiti 	return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
143facf6d5bSAlexandre Ghiti }
144facf6d5bSAlexandre Ghiti #endif
145facf6d5bSAlexandre Ghiti 
146544db759SAlexandre Ghiti #ifndef __HAVE_ARCH_HUGE_PTEP_GET
huge_ptep_get(pte_t * ptep)147544db759SAlexandre Ghiti static inline pte_t huge_ptep_get(pte_t *ptep)
148544db759SAlexandre Ghiti {
149481e980aSChristophe Leroy 	return ptep_get(ptep);
150544db759SAlexandre Ghiti }
151544db759SAlexandre Ghiti #endif
152544db759SAlexandre Ghiti 
1534eb0716eSAlexandre Ghiti #ifndef __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED
gigantic_page_runtime_supported(void)1544eb0716eSAlexandre Ghiti static inline bool gigantic_page_runtime_supported(void)
1554eb0716eSAlexandre Ghiti {
1564eb0716eSAlexandre Ghiti 	return IS_ENABLED(CONFIG_ARCH_HAS_GIGANTIC_PAGE);
1574eb0716eSAlexandre Ghiti }
1584eb0716eSAlexandre Ghiti #endif /* __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED */
1594eb0716eSAlexandre Ghiti 
160106c992aSGerald Schaefer #endif /* _ASM_GENERIC_HUGETLB_H */
161