diff options
Diffstat (limited to 'include/asm-generic/pgtable.h')
-rw-r--r-- | include/asm-generic/pgtable.h | 80 |
1 files changed, 76 insertions, 4 deletions
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h index 18af2bcefe6a..a0aba0f9c57b 100644 --- a/include/asm-generic/pgtable.h +++ b/include/asm-generic/pgtable.h | |||
@@ -36,6 +36,9 @@ extern int ptep_set_access_flags(struct vm_area_struct *vma, | |||
36 | extern int pmdp_set_access_flags(struct vm_area_struct *vma, | 36 | extern int pmdp_set_access_flags(struct vm_area_struct *vma, |
37 | unsigned long address, pmd_t *pmdp, | 37 | unsigned long address, pmd_t *pmdp, |
38 | pmd_t entry, int dirty); | 38 | pmd_t entry, int dirty); |
39 | extern int pudp_set_access_flags(struct vm_area_struct *vma, | ||
40 | unsigned long address, pud_t *pudp, | ||
41 | pud_t entry, int dirty); | ||
39 | #else | 42 | #else |
40 | static inline int pmdp_set_access_flags(struct vm_area_struct *vma, | 43 | static inline int pmdp_set_access_flags(struct vm_area_struct *vma, |
41 | unsigned long address, pmd_t *pmdp, | 44 | unsigned long address, pmd_t *pmdp, |
@@ -44,6 +47,13 @@ static inline int pmdp_set_access_flags(struct vm_area_struct *vma, | |||
44 | BUILD_BUG(); | 47 | BUILD_BUG(); |
45 | return 0; | 48 | return 0; |
46 | } | 49 | } |
50 | static inline int pudp_set_access_flags(struct vm_area_struct *vma, | ||
51 | unsigned long address, pud_t *pudp, | ||
52 | pud_t entry, int dirty) | ||
53 | { | ||
54 | BUILD_BUG(); | ||
55 | return 0; | ||
56 | } | ||
47 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 57 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
48 | #endif | 58 | #endif |
49 | 59 | ||
@@ -121,8 +131,8 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, | |||
121 | } | 131 | } |
122 | #endif | 132 | #endif |
123 | 133 | ||
124 | #ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR | ||
125 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 134 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
135 | #ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR | ||
126 | static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, | 136 | static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, |
127 | unsigned long address, | 137 | unsigned long address, |
128 | pmd_t *pmdp) | 138 | pmd_t *pmdp) |
@@ -131,20 +141,40 @@ static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, | |||
131 | pmd_clear(pmdp); | 141 | pmd_clear(pmdp); |
132 | return pmd; | 142 | return pmd; |
133 | } | 143 | } |
144 | #endif /* __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR */ | ||
145 | #ifndef __HAVE_ARCH_PUDP_HUGE_GET_AND_CLEAR | ||
146 | static inline pud_t pudp_huge_get_and_clear(struct mm_struct *mm, | ||
147 | unsigned long address, | ||
148 | pud_t *pudp) | ||
149 | { | ||
150 | pud_t pud = *pudp; | ||
151 | |||
152 | pud_clear(pudp); | ||
153 | return pud; | ||
154 | } | ||
155 | #endif /* __HAVE_ARCH_PUDP_HUGE_GET_AND_CLEAR */ | ||
134 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 156 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
135 | #endif | ||
136 | 157 | ||
137 | #ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR_FULL | ||
138 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 158 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
159 | #ifndef __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR_FULL | ||
139 | static inline pmd_t pmdp_huge_get_and_clear_full(struct mm_struct *mm, | 160 | static inline pmd_t pmdp_huge_get_and_clear_full(struct mm_struct *mm, |
140 | unsigned long address, pmd_t *pmdp, | 161 | unsigned long address, pmd_t *pmdp, |
141 | int full) | 162 | int full) |
142 | { | 163 | { |
143 | return pmdp_huge_get_and_clear(mm, address, pmdp); | 164 | return pmdp_huge_get_and_clear(mm, address, pmdp); |
144 | } | 165 | } |
145 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
146 | #endif | 166 | #endif |
147 | 167 | ||
168 | #ifndef __HAVE_ARCH_PUDP_HUGE_GET_AND_CLEAR_FULL | ||
169 | static inline pud_t pudp_huge_get_and_clear_full(struct mm_struct *mm, | ||
170 | unsigned long address, pud_t *pudp, | ||
171 | int full) | ||
172 | { | ||
173 | return pudp_huge_get_and_clear(mm, address, pudp); | ||
174 | } | ||
175 | #endif | ||
176 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | ||
177 | |||
148 | #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL | 178 | #ifndef __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL |
149 | static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, | 179 | static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, |
150 | unsigned long address, pte_t *ptep, | 180 | unsigned long address, pte_t *ptep, |
@@ -181,6 +211,9 @@ extern pte_t ptep_clear_flush(struct vm_area_struct *vma, | |||
181 | extern pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma, | 211 | extern pmd_t pmdp_huge_clear_flush(struct vm_area_struct *vma, |
182 | unsigned long address, | 212 | unsigned long address, |
183 | pmd_t *pmdp); | 213 | pmd_t *pmdp); |
214 | extern pud_t pudp_huge_clear_flush(struct vm_area_struct *vma, | ||
215 | unsigned long address, | ||
216 | pud_t *pudp); | ||
184 | #endif | 217 | #endif |
185 | 218 | ||
186 | #ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT | 219 | #ifndef __HAVE_ARCH_PTEP_SET_WRPROTECT |
@@ -208,6 +241,23 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, | |||
208 | } | 241 | } |
209 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 242 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
210 | #endif | 243 | #endif |
244 | #ifndef __HAVE_ARCH_PUDP_SET_WRPROTECT | ||
245 | #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD | ||
246 | static inline void pudp_set_wrprotect(struct mm_struct *mm, | ||
247 | unsigned long address, pud_t *pudp) | ||
248 | { | ||
249 | pud_t old_pud = *pudp; | ||
250 | |||
251 | set_pud_at(mm, address, pudp, pud_wrprotect(old_pud)); | ||
252 | } | ||
253 | #else | ||
254 | static inline void pudp_set_wrprotect(struct mm_struct *mm, | ||
255 | unsigned long address, pud_t *pudp) | ||
256 | { | ||
257 | BUILD_BUG(); | ||
258 | } | ||
259 | #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */ | ||
260 | #endif | ||
211 | 261 | ||
212 | #ifndef pmdp_collapse_flush | 262 | #ifndef pmdp_collapse_flush |
213 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 263 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
@@ -273,12 +323,23 @@ static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b) | |||
273 | { | 323 | { |
274 | return pmd_val(pmd_a) == pmd_val(pmd_b); | 324 | return pmd_val(pmd_a) == pmd_val(pmd_b); |
275 | } | 325 | } |
326 | |||
327 | static inline int pud_same(pud_t pud_a, pud_t pud_b) | ||
328 | { | ||
329 | return pud_val(pud_a) == pud_val(pud_b); | ||
330 | } | ||
276 | #else /* CONFIG_TRANSPARENT_HUGEPAGE */ | 331 | #else /* CONFIG_TRANSPARENT_HUGEPAGE */ |
277 | static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b) | 332 | static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b) |
278 | { | 333 | { |
279 | BUILD_BUG(); | 334 | BUILD_BUG(); |
280 | return 0; | 335 | return 0; |
281 | } | 336 | } |
337 | |||
338 | static inline int pud_same(pud_t pud_a, pud_t pud_b) | ||
339 | { | ||
340 | BUILD_BUG(); | ||
341 | return 0; | ||
342 | } | ||
282 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 343 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
283 | #endif | 344 | #endif |
284 | 345 | ||
@@ -640,6 +701,15 @@ static inline int pmd_write(pmd_t pmd) | |||
640 | #endif /* __HAVE_ARCH_PMD_WRITE */ | 701 | #endif /* __HAVE_ARCH_PMD_WRITE */ |
641 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ | 702 | #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ |
642 | 703 | ||
704 | #if !defined(CONFIG_TRANSPARENT_HUGEPAGE) || \ | ||
705 | (defined(CONFIG_TRANSPARENT_HUGEPAGE) && \ | ||
706 | !defined(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)) | ||
707 | static inline int pud_trans_huge(pud_t pud) | ||
708 | { | ||
709 | return 0; | ||
710 | } | ||
711 | #endif | ||
712 | |||
643 | #ifndef pmd_read_atomic | 713 | #ifndef pmd_read_atomic |
644 | static inline pmd_t pmd_read_atomic(pmd_t *pmdp) | 714 | static inline pmd_t pmd_read_atomic(pmd_t *pmdp) |
645 | { | 715 | { |
@@ -785,8 +855,10 @@ static inline int pmd_clear_huge(pmd_t *pmd) | |||
785 | * e.g. see arch/arc: flush_pmd_tlb_range | 855 | * e.g. see arch/arc: flush_pmd_tlb_range |
786 | */ | 856 | */ |
787 | #define flush_pmd_tlb_range(vma, addr, end) flush_tlb_range(vma, addr, end) | 857 | #define flush_pmd_tlb_range(vma, addr, end) flush_tlb_range(vma, addr, end) |
858 | #define flush_pud_tlb_range(vma, addr, end) flush_tlb_range(vma, addr, end) | ||
788 | #else | 859 | #else |
789 | #define flush_pmd_tlb_range(vma, addr, end) BUILD_BUG() | 860 | #define flush_pmd_tlb_range(vma, addr, end) BUILD_BUG() |
861 | #define flush_pud_tlb_range(vma, addr, end) BUILD_BUG() | ||
790 | #endif | 862 | #endif |
791 | #endif | 863 | #endif |
792 | 864 | ||