| 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: 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, address: 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, address: addr, ptep, entry: 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 |  | 
|---|