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); 17 void __page_table_check_pte_clear(struct mm_struct *mm, pte_t pte); 18 void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd); 19 void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud); 20 void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte, 21 unsigned int nr); 22 void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd); 23 void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud); 24 void __page_table_check_pte_clear_range(struct mm_struct *mm, 25 unsigned long addr, 26 pmd_t pmd); 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 44 static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte) 45 { 46 if (static_branch_likely(&page_table_check_disabled)) 47 return; 48 49 __page_table_check_pte_clear(mm, pte); 50 } 51 52 static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd) 53 { 54 if (static_branch_likely(&page_table_check_disabled)) 55 return; 56 57 __page_table_check_pmd_clear(mm, pmd); 58 } 59 60 static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud) 61 { 62 if (static_branch_likely(&page_table_check_disabled)) 63 return; 64 65 __page_table_check_pud_clear(mm, pud); 66 } 67 68 static inline void page_table_check_ptes_set(struct mm_struct *mm, 69 pte_t *ptep, pte_t pte, unsigned int nr) 70 { 71 if (static_branch_likely(&page_table_check_disabled)) 72 return; 73 74 __page_table_check_ptes_set(mm, ptep, pte, nr); 75 } 76 77 static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, 78 pmd_t pmd) 79 { 80 if (static_branch_likely(&page_table_check_disabled)) 81 return; 82 83 __page_table_check_pmd_set(mm, pmdp, pmd); 84 } 85 86 static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, 87 pud_t pud) 88 { 89 if (static_branch_likely(&page_table_check_disabled)) 90 return; 91 92 __page_table_check_pud_set(mm, pudp, pud); 93 } 94 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 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 115 static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte) 116 { 117 } 118 119 static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd) 120 { 121 } 122 123 static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud) 124 { 125 } 126 127 static inline void page_table_check_ptes_set(struct mm_struct *mm, 128 pte_t *ptep, pte_t pte, unsigned int nr) 129 { 130 } 131 132 static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, 133 pmd_t pmd) 134 { 135 } 136 137 static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, 138 pud_t pud) 139 { 140 } 141 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 148 #endif /* CONFIG_PAGE_TABLE_CHECK */ 149 #endif /* __LINUX_PAGE_TABLE_CHECK_H */ 150