1 /* SPDX-License-Identifier: GPL-2.0 */
4 * Copyright (c) 2021, Google LLC.
7 #ifndef __LINUX_PAGE_TABLE_CHECK_H
8 #define __LINUX_PAGE_TABLE_CHECK_H
10 #ifdef CONFIG_PAGE_TABLE_CHECK
11 #include <linux/jump_label.h>
13 extern struct static_key_true page_table_check_disabled;
14 extern struct page_ext_operations page_table_check_ops;
16 void __page_table_check_zero(struct page *page, unsigned int order);
17 void __page_table_check_pte_clear(struct mm_struct *mm, unsigned long addr,
19 void __page_table_check_pmd_clear(struct mm_struct *mm, unsigned long addr,
21 void __page_table_check_pud_clear(struct mm_struct *mm, unsigned long addr,
23 void __page_table_check_pte_set(struct mm_struct *mm, unsigned long addr,
24 pte_t *ptep, pte_t pte);
25 void __page_table_check_pmd_set(struct mm_struct *mm, unsigned long addr,
26 pmd_t *pmdp, pmd_t pmd);
27 void __page_table_check_pud_set(struct mm_struct *mm, unsigned long addr,
28 pud_t *pudp, pud_t pud);
29 void __page_table_check_pte_clear_range(struct mm_struct *mm,
33 static inline void page_table_check_alloc(struct page *page, unsigned int order)
35 if (static_branch_likely(&page_table_check_disabled))
38 __page_table_check_zero(page, order);
41 static inline void page_table_check_free(struct page *page, unsigned int order)
43 if (static_branch_likely(&page_table_check_disabled))
46 __page_table_check_zero(page, order);
49 static inline void page_table_check_pte_clear(struct mm_struct *mm,
50 unsigned long addr, pte_t pte)
52 if (static_branch_likely(&page_table_check_disabled))
55 __page_table_check_pte_clear(mm, addr, pte);
58 static inline void page_table_check_pmd_clear(struct mm_struct *mm,
59 unsigned long addr, pmd_t pmd)
61 if (static_branch_likely(&page_table_check_disabled))
64 __page_table_check_pmd_clear(mm, addr, pmd);
67 static inline void page_table_check_pud_clear(struct mm_struct *mm,
68 unsigned long addr, pud_t pud)
70 if (static_branch_likely(&page_table_check_disabled))
73 __page_table_check_pud_clear(mm, addr, pud);
76 static inline void page_table_check_pte_set(struct mm_struct *mm,
77 unsigned long addr, pte_t *ptep,
80 if (static_branch_likely(&page_table_check_disabled))
83 __page_table_check_pte_set(mm, addr, ptep, pte);
86 static inline void page_table_check_pmd_set(struct mm_struct *mm,
87 unsigned long addr, pmd_t *pmdp,
90 if (static_branch_likely(&page_table_check_disabled))
93 __page_table_check_pmd_set(mm, addr, pmdp, pmd);
96 static inline void page_table_check_pud_set(struct mm_struct *mm,
97 unsigned long addr, pud_t *pudp,
100 if (static_branch_likely(&page_table_check_disabled))
103 __page_table_check_pud_set(mm, addr, pudp, pud);
106 static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
110 if (static_branch_likely(&page_table_check_disabled))
113 __page_table_check_pte_clear_range(mm, addr, pmd);
118 static inline void page_table_check_alloc(struct page *page, unsigned int order)
122 static inline void page_table_check_free(struct page *page, unsigned int order)
126 static inline void page_table_check_pte_clear(struct mm_struct *mm,
127 unsigned long addr, pte_t pte)
131 static inline void page_table_check_pmd_clear(struct mm_struct *mm,
132 unsigned long addr, pmd_t pmd)
136 static inline void page_table_check_pud_clear(struct mm_struct *mm,
137 unsigned long addr, pud_t pud)
141 static inline void page_table_check_pte_set(struct mm_struct *mm,
142 unsigned long addr, pte_t *ptep,
147 static inline void page_table_check_pmd_set(struct mm_struct *mm,
148 unsigned long addr, pmd_t *pmdp,
153 static inline void page_table_check_pud_set(struct mm_struct *mm,
154 unsigned long addr, pud_t *pudp,
159 static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
165 #endif /* CONFIG_PAGE_TABLE_CHECK */
166 #endif /* __LINUX_PAGE_TABLE_CHECK_H */