150 lines · c
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_H8#define __LINUX_PAGE_TABLE_CHECK_H9 10#ifdef CONFIG_PAGE_TABLE_CHECK11#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#else106 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