1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ASM_GENERIC_HUGETLB_H 3 #define _ASM_GENERIC_HUGETLB_H 4 5 #include <linux/swap.h> 6 #include <linux/swapops.h> 7 8 static inline unsigned long huge_pte_write(pte_t pte) 9 { 10 return pte_write(pte); 11 } 12 13 static inline unsigned long huge_pte_dirty(pte_t pte) 14 { 15 return pte_dirty(pte); 16 } 17 18 static inline pte_t huge_pte_mkwrite(pte_t pte) 19 { 20 return pte_mkwrite_novma(pte); 21 } 22 23 #ifndef __HAVE_ARCH_HUGE_PTE_WRPROTECT 24 static inline pte_t huge_pte_wrprotect(pte_t pte) 25 { 26 return pte_wrprotect(pte); 27 } 28 #endif 29 30 static inline pte_t huge_pte_mkdirty(pte_t pte) 31 { 32 return pte_mkdirty(pte); 33 } 34 35 static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot) 36 { 37 return pte_modify(pte, newprot); 38 } 39 40 #ifndef __HAVE_ARCH_HUGE_PTE_MKUFFD_WP 41 static inline pte_t huge_pte_mkuffd_wp(pte_t pte) 42 { 43 return huge_pte_wrprotect(pte_mkuffd_wp(pte)); 44 } 45 #endif 46 47 #ifndef __HAVE_ARCH_HUGE_PTE_CLEAR_UFFD_WP 48 static inline pte_t huge_pte_clear_uffd_wp(pte_t pte) 49 { 50 return pte_clear_uffd_wp(pte); 51 } 52 #endif 53 54 #ifndef __HAVE_ARCH_HUGE_PTE_UFFD_WP 55 static inline int huge_pte_uffd_wp(pte_t pte) 56 { 57 return pte_uffd_wp(pte); 58 } 59 #endif 60 61 #ifndef __HAVE_ARCH_HUGE_PTE_CLEAR 62 static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, 63 pte_t *ptep, unsigned long sz) 64 { 65 pte_clear(mm, addr, ptep); 66 } 67 #endif 68 69 #ifndef __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE 70 static inline void hugetlb_free_pgd_range(struct mmu_gather *tlb, 71 unsigned long addr, unsigned long end, 72 unsigned long floor, unsigned long ceiling) 73 { 74 free_pgd_range(tlb, addr, end, floor, ceiling); 75 } 76 #endif 77 78 #ifndef __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT 79 static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 80 pte_t *ptep, pte_t pte, unsigned long sz) 81 { 82 set_pte_at(mm, addr, ptep, pte); 83 } 84 #endif 85 86 #ifndef __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR 87 static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, 88 unsigned long addr, pte_t *ptep, unsigned long sz) 89 { 90 return ptep_get_and_clear(mm, addr, ptep); 91 } 92 #endif 93 94 #ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH 95 static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma, 96 unsigned long addr, pte_t *ptep) 97 { 98 return ptep_clear_flush(vma, addr, ptep); 99 } 100 #endif 101 102 #ifndef __HAVE_ARCH_HUGE_PTE_NONE 103 static inline int huge_pte_none(pte_t pte) 104 { 105 return pte_none(pte); 106 } 107 #endif 108 109 /* Please refer to comments above pte_none_mostly() for the usage */ 110 #ifndef __HAVE_ARCH_HUGE_PTE_NONE_MOSTLY 111 static inline int huge_pte_none_mostly(pte_t pte) 112 { 113 return huge_pte_none(pte) || is_pte_marker(pte); 114 } 115 #endif 116 117 #ifndef __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE 118 static inline int prepare_hugepage_range(struct file *file, 119 unsigned long addr, unsigned long len) 120 { 121 return 0; 122 } 123 #endif 124 125 #ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT 126 static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, 127 unsigned long addr, pte_t *ptep) 128 { 129 ptep_set_wrprotect(mm, addr, ptep); 130 } 131 #endif 132 133 #ifndef __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS 134 static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, 135 unsigned long addr, pte_t *ptep, 136 pte_t pte, int dirty) 137 { 138 return ptep_set_access_flags(vma, addr, ptep, pte, dirty); 139 } 140 #endif 141 142 #ifndef __HAVE_ARCH_HUGE_PTEP_GET 143 static inline pte_t huge_ptep_get(struct mm_struct *mm, unsigned long addr, pte_t *ptep) 144 { 145 return ptep_get(ptep); 146 } 147 #endif 148 149 #ifndef __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED 150 static inline bool gigantic_page_runtime_supported(void) 151 { 152 return IS_ENABLED(CONFIG_ARCH_HAS_GIGANTIC_PAGE); 153 } 154 #endif /* __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED */ 155 156 #endif /* _ASM_GENERIC_HUGETLB_H */ 157