Commit | Line | Data |
---|---|---|
df4e817b PT |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | /* | |
4 | * Copyright (c) 2021, Google LLC. | |
5 | * Pasha Tatashin <pasha.tatashin@soleen.com> | |
6 | */ | |
7 | #ifndef __LINUX_PAGE_TABLE_CHECK_H | |
8 | #define __LINUX_PAGE_TABLE_CHECK_H | |
9 | ||
10 | #ifdef CONFIG_PAGE_TABLE_CHECK | |
11 | #include <linux/jump_label.h> | |
12 | ||
13 | extern struct static_key_true page_table_check_disabled; | |
14 | extern struct page_ext_operations page_table_check_ops; | |
15 | ||
16 | void __page_table_check_zero(struct page *page, unsigned int order); | |
aa232204 | 17 | void __page_table_check_pte_clear(struct mm_struct *mm, pte_t pte); |
1831414c | 18 | void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd); |
931c38e1 | 19 | void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud); |
a3793220 MWO |
20 | void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte, |
21 | unsigned int nr); | |
a3b83713 | 22 | void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd); |
6d144436 | 23 | void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud); |
80110bbf PT |
24 | void __page_table_check_pte_clear_range(struct mm_struct *mm, |
25 | unsigned long addr, | |
26 | pmd_t pmd); | |
df4e817b PT |
27 | |
28 | static inline void page_table_check_alloc(struct page *page, unsigned int order) | |
29 | { | |
30 | if (static_branch_likely(&page_table_check_disabled)) | |
31 | return; | |
32 | ||
33 | __page_table_check_zero(page, order); | |
34 | } | |
35 | ||
36 | static inline void page_table_check_free(struct page *page, unsigned int order) | |
37 | { | |
38 | if (static_branch_likely(&page_table_check_disabled)) | |
39 | return; | |
40 | ||
41 | __page_table_check_zero(page, order); | |
42 | } | |
43 | ||
aa232204 | 44 | static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte) |
df4e817b PT |
45 | { |
46 | if (static_branch_likely(&page_table_check_disabled)) | |
47 | return; | |
48 | ||
aa232204 | 49 | __page_table_check_pte_clear(mm, pte); |
df4e817b PT |
50 | } |
51 | ||
1831414c | 52 | static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd) |
df4e817b PT |
53 | { |
54 | if (static_branch_likely(&page_table_check_disabled)) | |
55 | return; | |
56 | ||
1831414c | 57 | __page_table_check_pmd_clear(mm, pmd); |
df4e817b PT |
58 | } |
59 | ||
931c38e1 | 60 | static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud) |
df4e817b PT |
61 | { |
62 | if (static_branch_likely(&page_table_check_disabled)) | |
63 | return; | |
64 | ||
931c38e1 | 65 | __page_table_check_pud_clear(mm, pud); |
df4e817b PT |
66 | } |
67 | ||
a3793220 MWO |
68 | static inline void page_table_check_ptes_set(struct mm_struct *mm, |
69 | pte_t *ptep, pte_t pte, unsigned int nr) | |
df4e817b PT |
70 | { |
71 | if (static_branch_likely(&page_table_check_disabled)) | |
72 | return; | |
73 | ||
a3793220 | 74 | __page_table_check_ptes_set(mm, ptep, pte, nr); |
df4e817b PT |
75 | } |
76 | ||
a3b83713 | 77 | static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, |
df4e817b PT |
78 | pmd_t pmd) |
79 | { | |
80 | if (static_branch_likely(&page_table_check_disabled)) | |
81 | return; | |
82 | ||
a3b83713 | 83 | __page_table_check_pmd_set(mm, pmdp, pmd); |
df4e817b PT |
84 | } |
85 | ||
6d144436 | 86 | static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, |
df4e817b PT |
87 | pud_t pud) |
88 | { | |
89 | if (static_branch_likely(&page_table_check_disabled)) | |
90 | return; | |
91 | ||
6d144436 | 92 | __page_table_check_pud_set(mm, pudp, pud); |
df4e817b PT |
93 | } |
94 | ||
80110bbf PT |
95 | static inline void page_table_check_pte_clear_range(struct mm_struct *mm, |
96 | unsigned long addr, | |
97 | pmd_t pmd) | |
98 | { | |
99 | if (static_branch_likely(&page_table_check_disabled)) | |
100 | return; | |
101 | ||
102 | __page_table_check_pte_clear_range(mm, addr, pmd); | |
103 | } | |
104 | ||
df4e817b PT |
105 | #else |
106 | ||
107 | static inline void page_table_check_alloc(struct page *page, unsigned int order) | |
108 | { | |
109 | } | |
110 | ||
111 | static inline void page_table_check_free(struct page *page, unsigned int order) | |
112 | { | |
113 | } | |
114 | ||
aa232204 | 115 | static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte) |
df4e817b PT |
116 | { |
117 | } | |
118 | ||
1831414c | 119 | static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd) |
df4e817b PT |
120 | { |
121 | } | |
122 | ||
931c38e1 | 123 | static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud) |
df4e817b PT |
124 | { |
125 | } | |
126 | ||
a3793220 MWO |
127 | static inline void page_table_check_ptes_set(struct mm_struct *mm, |
128 | pte_t *ptep, pte_t pte, unsigned int nr) | |
df4e817b PT |
129 | { |
130 | } | |
131 | ||
a3b83713 | 132 | static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, |
df4e817b PT |
133 | pmd_t pmd) |
134 | { | |
135 | } | |
136 | ||
6d144436 | 137 | static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, |
df4e817b PT |
138 | pud_t pud) |
139 | { | |
140 | } | |
141 | ||
80110bbf PT |
142 | static inline void page_table_check_pte_clear_range(struct mm_struct *mm, |
143 | unsigned long addr, | |
144 | pmd_t pmd) | |
145 | { | |
146 | } | |
147 | ||
df4e817b PT |
148 | #endif /* CONFIG_PAGE_TABLE_CHECK */ |
149 | #endif /* __LINUX_PAGE_TABLE_CHECK_H */ |