1df4e817bSPasha Tatashin /* SPDX-License-Identifier: GPL-2.0 */
2df4e817bSPasha Tatashin 
3df4e817bSPasha Tatashin /*
4df4e817bSPasha Tatashin  * Copyright (c) 2021, Google LLC.
5df4e817bSPasha Tatashin  * Pasha Tatashin <[email protected]>
6df4e817bSPasha Tatashin  */
7df4e817bSPasha Tatashin #ifndef __LINUX_PAGE_TABLE_CHECK_H
8df4e817bSPasha Tatashin #define __LINUX_PAGE_TABLE_CHECK_H
9df4e817bSPasha Tatashin 
10df4e817bSPasha Tatashin #ifdef CONFIG_PAGE_TABLE_CHECK
11df4e817bSPasha Tatashin #include <linux/jump_label.h>
12df4e817bSPasha Tatashin 
13df4e817bSPasha Tatashin extern struct static_key_true page_table_check_disabled;
14df4e817bSPasha Tatashin extern struct page_ext_operations page_table_check_ops;
15df4e817bSPasha Tatashin 
16df4e817bSPasha Tatashin void __page_table_check_zero(struct page *page, unsigned int order);
17aa232204SKemeng Shi void __page_table_check_pte_clear(struct mm_struct *mm, pte_t pte);
181831414cSKemeng Shi void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd);
19931c38e1SKemeng Shi void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud);
20*a3793220SMatthew Wilcox (Oracle) void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte,
21*a3793220SMatthew Wilcox (Oracle) 		unsigned int nr);
22a3b83713SKemeng Shi void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd);
236d144436SKemeng Shi void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud);
2480110bbfSPasha Tatashin void __page_table_check_pte_clear_range(struct mm_struct *mm,
2580110bbfSPasha Tatashin 					unsigned long addr,
2680110bbfSPasha Tatashin 					pmd_t pmd);
27df4e817bSPasha Tatashin 
page_table_check_alloc(struct page * page,unsigned int order)28df4e817bSPasha Tatashin static inline void page_table_check_alloc(struct page *page, unsigned int order)
29df4e817bSPasha Tatashin {
30df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
31df4e817bSPasha Tatashin 		return;
32df4e817bSPasha Tatashin 
33df4e817bSPasha Tatashin 	__page_table_check_zero(page, order);
34df4e817bSPasha Tatashin }
35df4e817bSPasha Tatashin 
page_table_check_free(struct page * page,unsigned int order)36df4e817bSPasha Tatashin static inline void page_table_check_free(struct page *page, unsigned int order)
37df4e817bSPasha Tatashin {
38df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
39df4e817bSPasha Tatashin 		return;
40df4e817bSPasha Tatashin 
41df4e817bSPasha Tatashin 	__page_table_check_zero(page, order);
42df4e817bSPasha Tatashin }
43df4e817bSPasha Tatashin 
page_table_check_pte_clear(struct mm_struct * mm,pte_t pte)44aa232204SKemeng Shi static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte)
45df4e817bSPasha Tatashin {
46df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
47df4e817bSPasha Tatashin 		return;
48df4e817bSPasha Tatashin 
49aa232204SKemeng Shi 	__page_table_check_pte_clear(mm, pte);
50df4e817bSPasha Tatashin }
51df4e817bSPasha Tatashin 
page_table_check_pmd_clear(struct mm_struct * mm,pmd_t pmd)521831414cSKemeng Shi static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd)
53df4e817bSPasha Tatashin {
54df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
55df4e817bSPasha Tatashin 		return;
56df4e817bSPasha Tatashin 
571831414cSKemeng Shi 	__page_table_check_pmd_clear(mm, pmd);
58df4e817bSPasha Tatashin }
59df4e817bSPasha Tatashin 
page_table_check_pud_clear(struct mm_struct * mm,pud_t pud)60931c38e1SKemeng Shi static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud)
61df4e817bSPasha Tatashin {
62df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
63df4e817bSPasha Tatashin 		return;
64df4e817bSPasha Tatashin 
65931c38e1SKemeng Shi 	__page_table_check_pud_clear(mm, pud);
66df4e817bSPasha Tatashin }
67df4e817bSPasha Tatashin 
page_table_check_ptes_set(struct mm_struct * mm,pte_t * ptep,pte_t pte,unsigned int nr)68*a3793220SMatthew Wilcox (Oracle) static inline void page_table_check_ptes_set(struct mm_struct *mm,
69*a3793220SMatthew Wilcox (Oracle) 		pte_t *ptep, pte_t pte, unsigned int nr)
70df4e817bSPasha Tatashin {
71df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
72df4e817bSPasha Tatashin 		return;
73df4e817bSPasha Tatashin 
74*a3793220SMatthew Wilcox (Oracle) 	__page_table_check_ptes_set(mm, ptep, pte, nr);
75df4e817bSPasha Tatashin }
76df4e817bSPasha Tatashin 
page_table_check_pmd_set(struct mm_struct * mm,pmd_t * pmdp,pmd_t pmd)77a3b83713SKemeng Shi static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp,
78df4e817bSPasha Tatashin 					    pmd_t pmd)
79df4e817bSPasha Tatashin {
80df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
81df4e817bSPasha Tatashin 		return;
82df4e817bSPasha Tatashin 
83a3b83713SKemeng Shi 	__page_table_check_pmd_set(mm, pmdp, pmd);
84df4e817bSPasha Tatashin }
85df4e817bSPasha Tatashin 
page_table_check_pud_set(struct mm_struct * mm,pud_t * pudp,pud_t pud)866d144436SKemeng Shi static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp,
87df4e817bSPasha Tatashin 					    pud_t pud)
88df4e817bSPasha Tatashin {
89df4e817bSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
90df4e817bSPasha Tatashin 		return;
91df4e817bSPasha Tatashin 
926d144436SKemeng Shi 	__page_table_check_pud_set(mm, pudp, pud);
93df4e817bSPasha Tatashin }
94df4e817bSPasha Tatashin 
page_table_check_pte_clear_range(struct mm_struct * mm,unsigned long addr,pmd_t pmd)9580110bbfSPasha Tatashin static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
9680110bbfSPasha Tatashin 						    unsigned long addr,
9780110bbfSPasha Tatashin 						    pmd_t pmd)
9880110bbfSPasha Tatashin {
9980110bbfSPasha Tatashin 	if (static_branch_likely(&page_table_check_disabled))
10080110bbfSPasha Tatashin 		return;
10180110bbfSPasha Tatashin 
10280110bbfSPasha Tatashin 	__page_table_check_pte_clear_range(mm, addr, pmd);
10380110bbfSPasha Tatashin }
10480110bbfSPasha Tatashin 
105df4e817bSPasha Tatashin #else
106df4e817bSPasha Tatashin 
page_table_check_alloc(struct page * page,unsigned int order)107df4e817bSPasha Tatashin static inline void page_table_check_alloc(struct page *page, unsigned int order)
108df4e817bSPasha Tatashin {
109df4e817bSPasha Tatashin }
110df4e817bSPasha Tatashin 
page_table_check_free(struct page * page,unsigned int order)111df4e817bSPasha Tatashin static inline void page_table_check_free(struct page *page, unsigned int order)
112df4e817bSPasha Tatashin {
113df4e817bSPasha Tatashin }
114df4e817bSPasha Tatashin 
page_table_check_pte_clear(struct mm_struct * mm,pte_t pte)115aa232204SKemeng Shi static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte)
116df4e817bSPasha Tatashin {
117df4e817bSPasha Tatashin }
118df4e817bSPasha Tatashin 
page_table_check_pmd_clear(struct mm_struct * mm,pmd_t pmd)1191831414cSKemeng Shi static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd)
120df4e817bSPasha Tatashin {
121df4e817bSPasha Tatashin }
122df4e817bSPasha Tatashin 
page_table_check_pud_clear(struct mm_struct * mm,pud_t pud)123931c38e1SKemeng Shi static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud)
124df4e817bSPasha Tatashin {
125df4e817bSPasha Tatashin }
126df4e817bSPasha Tatashin 
page_table_check_ptes_set(struct mm_struct * mm,pte_t * ptep,pte_t pte,unsigned int nr)127*a3793220SMatthew Wilcox (Oracle) static inline void page_table_check_ptes_set(struct mm_struct *mm,
128*a3793220SMatthew Wilcox (Oracle) 		pte_t *ptep, pte_t pte, unsigned int nr)
129df4e817bSPasha Tatashin {
130df4e817bSPasha Tatashin }
131df4e817bSPasha Tatashin 
page_table_check_pmd_set(struct mm_struct * mm,pmd_t * pmdp,pmd_t pmd)132a3b83713SKemeng Shi static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp,
133df4e817bSPasha Tatashin 					    pmd_t pmd)
134df4e817bSPasha Tatashin {
135df4e817bSPasha Tatashin }
136df4e817bSPasha Tatashin 
page_table_check_pud_set(struct mm_struct * mm,pud_t * pudp,pud_t pud)1376d144436SKemeng Shi static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp,
138df4e817bSPasha Tatashin 					    pud_t pud)
139df4e817bSPasha Tatashin {
140df4e817bSPasha Tatashin }
141df4e817bSPasha Tatashin 
page_table_check_pte_clear_range(struct mm_struct * mm,unsigned long addr,pmd_t pmd)14280110bbfSPasha Tatashin static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
14380110bbfSPasha Tatashin 						    unsigned long addr,
14480110bbfSPasha Tatashin 						    pmd_t pmd)
14580110bbfSPasha Tatashin {
14680110bbfSPasha Tatashin }
14780110bbfSPasha Tatashin 
148df4e817bSPasha Tatashin #endif /* CONFIG_PAGE_TABLE_CHECK */
149df4e817bSPasha Tatashin #endif /* __LINUX_PAGE_TABLE_CHECK_H */
150