Merge tag 'mm-hotfixes-stable-2023-05-03-16-27' of git://git.kernel.org/pub/scm/linux...
[linux-block.git] / include / linux / page_table_check.h
CommitLineData
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
13extern struct static_key_true page_table_check_disabled;
14extern struct page_ext_operations page_table_check_ops;
15
16void __page_table_check_zero(struct page *page, unsigned int order);
17void __page_table_check_pte_clear(struct mm_struct *mm, unsigned long addr,
18 pte_t pte);
19void __page_table_check_pmd_clear(struct mm_struct *mm, unsigned long addr,
20 pmd_t pmd);
21void __page_table_check_pud_clear(struct mm_struct *mm, unsigned long addr,
22 pud_t pud);
23void __page_table_check_pte_set(struct mm_struct *mm, unsigned long addr,
24 pte_t *ptep, pte_t pte);
25void __page_table_check_pmd_set(struct mm_struct *mm, unsigned long addr,
26 pmd_t *pmdp, pmd_t pmd);
27void __page_table_check_pud_set(struct mm_struct *mm, unsigned long addr,
28 pud_t *pudp, pud_t pud);
80110bbf
PT
29void __page_table_check_pte_clear_range(struct mm_struct *mm,
30 unsigned long addr,
31 pmd_t pmd);
df4e817b
PT
32
33static inline void page_table_check_alloc(struct page *page, unsigned int order)
34{
35 if (static_branch_likely(&page_table_check_disabled))
36 return;
37
38 __page_table_check_zero(page, order);
39}
40
41static inline void page_table_check_free(struct page *page, unsigned int order)
42{
43 if (static_branch_likely(&page_table_check_disabled))
44 return;
45
46 __page_table_check_zero(page, order);
47}
48
49static inline void page_table_check_pte_clear(struct mm_struct *mm,
50 unsigned long addr, pte_t pte)
51{
52 if (static_branch_likely(&page_table_check_disabled))
53 return;
54
55 __page_table_check_pte_clear(mm, addr, pte);
56}
57
58static inline void page_table_check_pmd_clear(struct mm_struct *mm,
59 unsigned long addr, pmd_t pmd)
60{
61 if (static_branch_likely(&page_table_check_disabled))
62 return;
63
64 __page_table_check_pmd_clear(mm, addr, pmd);
65}
66
67static inline void page_table_check_pud_clear(struct mm_struct *mm,
68 unsigned long addr, pud_t pud)
69{
70 if (static_branch_likely(&page_table_check_disabled))
71 return;
72
73 __page_table_check_pud_clear(mm, addr, pud);
74}
75
76static inline void page_table_check_pte_set(struct mm_struct *mm,
77 unsigned long addr, pte_t *ptep,
78 pte_t pte)
79{
80 if (static_branch_likely(&page_table_check_disabled))
81 return;
82
83 __page_table_check_pte_set(mm, addr, ptep, pte);
84}
85
86static inline void page_table_check_pmd_set(struct mm_struct *mm,
87 unsigned long addr, pmd_t *pmdp,
88 pmd_t pmd)
89{
90 if (static_branch_likely(&page_table_check_disabled))
91 return;
92
93 __page_table_check_pmd_set(mm, addr, pmdp, pmd);
94}
95
96static inline void page_table_check_pud_set(struct mm_struct *mm,
97 unsigned long addr, pud_t *pudp,
98 pud_t pud)
99{
100 if (static_branch_likely(&page_table_check_disabled))
101 return;
102
103 __page_table_check_pud_set(mm, addr, pudp, pud);
104}
105
80110bbf
PT
106static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
107 unsigned long addr,
108 pmd_t pmd)
109{
110 if (static_branch_likely(&page_table_check_disabled))
111 return;
112
113 __page_table_check_pte_clear_range(mm, addr, pmd);
114}
115
df4e817b
PT
116#else
117
118static inline void page_table_check_alloc(struct page *page, unsigned int order)
119{
120}
121
122static inline void page_table_check_free(struct page *page, unsigned int order)
123{
124}
125
126static inline void page_table_check_pte_clear(struct mm_struct *mm,
127 unsigned long addr, pte_t pte)
128{
129}
130
131static inline void page_table_check_pmd_clear(struct mm_struct *mm,
132 unsigned long addr, pmd_t pmd)
133{
134}
135
136static inline void page_table_check_pud_clear(struct mm_struct *mm,
137 unsigned long addr, pud_t pud)
138{
139}
140
141static inline void page_table_check_pte_set(struct mm_struct *mm,
142 unsigned long addr, pte_t *ptep,
143 pte_t pte)
144{
145}
146
147static inline void page_table_check_pmd_set(struct mm_struct *mm,
148 unsigned long addr, pmd_t *pmdp,
149 pmd_t pmd)
150{
151}
152
153static inline void page_table_check_pud_set(struct mm_struct *mm,
154 unsigned long addr, pud_t *pudp,
155 pud_t pud)
156{
157}
158
80110bbf
PT
159static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
160 unsigned long addr,
161 pmd_t pmd)
162{
163}
164
df4e817b
PT
165#endif /* CONFIG_PAGE_TABLE_CHECK */
166#endif /* __LINUX_PAGE_TABLE_CHECK_H */