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, pte_t pte); 18void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd); 19void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud); 20void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte, 21 unsigned int nr); 22void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd); 23void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud); 24void __page_table_check_pte_clear_range(struct mm_struct *mm, 25 unsigned long addr, 26 pmd_t pmd); 27 28static 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 36static 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 44static 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 52static 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 60static 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 68static 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 77static 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 86static 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 95static 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 107static inline void page_table_check_alloc(struct page *page, unsigned int order) 108{ 109} 110 111static inline void page_table_check_free(struct page *page, unsigned int order) 112{ 113} 114 115static inline void page_table_check_pte_clear(struct mm_struct *mm, pte_t pte) 116{ 117} 118 119static inline void page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd) 120{ 121} 122 123static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud) 124{ 125} 126 127static inline void page_table_check_ptes_set(struct mm_struct *mm, 128 pte_t *ptep, pte_t pte, unsigned int nr) 129{ 130} 131 132static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, 133 pmd_t pmd) 134{ 135} 136 137static inline void page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, 138 pud_t pud) 139{ 140} 141 142static 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