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_HUGE_SET_HUGE_PTE_AT 70 static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 71 pte_t *ptep, pte_t pte, unsigned long sz) 72 { 73 set_pte_at(mm, addr, ptep, pte); 74 } 75 #endif 76 77 #ifndef __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR 78 static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, 79 unsigned long addr, pte_t *ptep, unsigned long sz) 80 { 81 return ptep_get_and_clear(mm, addr, ptep); 82 } 83 #endif 84 85 #ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH 86 static inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma, 87 unsigned long addr, pte_t *ptep) 88 { 89 return ptep_clear_flush(vma, addr, ptep); 90 } 91 #endif 92 93 #ifndef __HAVE_ARCH_HUGE_PTE_NONE 94 static inline int huge_pte_none(pte_t pte) 95 { 96 return pte_none(pte); 97 } 98 #endif 99 100 /* Please refer to comments above pte_none_mostly() for the usage */ 101 #ifndef __HAVE_ARCH_HUGE_PTE_NONE_MOSTLY 102 static inline int huge_pte_none_mostly(pte_t pte) 103 { 104 return huge_pte_none(pte) || is_pte_marker(pte); 105 } 106 #endif 107 108 #ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT 109 static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, 110 unsigned long addr, pte_t *ptep) 111 { 112 ptep_set_wrprotect(mm, addr, ptep); 113 } 114 #endif 115 116 #ifndef __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS 117 static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, 118 unsigned long addr, pte_t *ptep, 119 pte_t pte, int dirty) 120 { 121 return ptep_set_access_flags(vma, addr, ptep, pte, dirty); 122 } 123 #endif 124 125 #ifndef __HAVE_ARCH_HUGE_PTEP_GET 126 static inline pte_t huge_ptep_get(struct mm_struct *mm, unsigned long addr, pte_t *ptep) 127 { 128 return ptep_get(ptep); 129 } 130 #endif 131 132 #ifndef __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED 133 static inline bool gigantic_page_runtime_supported(void) 134 { 135 return IS_ENABLED(CONFIG_ARCH_HAS_GIGANTIC_PAGE); 136 } 137 #endif /* __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED */ 138 139 #endif /* _ASM_GENERIC_HUGETLB_H */ 140