123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (c) 2021, Google LLC.
- * Pasha Tatashin <[email protected]>
- */
- #ifndef __LINUX_PAGE_TABLE_CHECK_H
- #define __LINUX_PAGE_TABLE_CHECK_H
- #ifdef CONFIG_PAGE_TABLE_CHECK
- #include <linux/jump_label.h>
- extern struct static_key_true page_table_check_disabled;
- extern struct page_ext_operations page_table_check_ops;
- void __page_table_check_zero(struct page *page, unsigned int order);
- void __page_table_check_pte_clear(struct mm_struct *mm, unsigned long addr,
- pte_t pte);
- void __page_table_check_pmd_clear(struct mm_struct *mm, unsigned long addr,
- pmd_t pmd);
- void __page_table_check_pud_clear(struct mm_struct *mm, unsigned long addr,
- pud_t pud);
- void __page_table_check_pte_set(struct mm_struct *mm, unsigned long addr,
- pte_t *ptep, pte_t pte);
- void __page_table_check_pmd_set(struct mm_struct *mm, unsigned long addr,
- pmd_t *pmdp, pmd_t pmd);
- void __page_table_check_pud_set(struct mm_struct *mm, unsigned long addr,
- pud_t *pudp, pud_t pud);
- void __page_table_check_pte_clear_range(struct mm_struct *mm,
- unsigned long addr,
- pmd_t pmd);
- static inline void page_table_check_alloc(struct page *page, unsigned int order)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_zero(page, order);
- }
- static inline void page_table_check_free(struct page *page, unsigned int order)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_zero(page, order);
- }
- static inline void page_table_check_pte_clear(struct mm_struct *mm,
- unsigned long addr, pte_t pte)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pte_clear(mm, addr, pte);
- }
- static inline void page_table_check_pmd_clear(struct mm_struct *mm,
- unsigned long addr, pmd_t pmd)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pmd_clear(mm, addr, pmd);
- }
- static inline void page_table_check_pud_clear(struct mm_struct *mm,
- unsigned long addr, pud_t pud)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pud_clear(mm, addr, pud);
- }
- static inline void page_table_check_pte_set(struct mm_struct *mm,
- unsigned long addr, pte_t *ptep,
- pte_t pte)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pte_set(mm, addr, ptep, pte);
- }
- static inline void page_table_check_pmd_set(struct mm_struct *mm,
- unsigned long addr, pmd_t *pmdp,
- pmd_t pmd)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pmd_set(mm, addr, pmdp, pmd);
- }
- static inline void page_table_check_pud_set(struct mm_struct *mm,
- unsigned long addr, pud_t *pudp,
- pud_t pud)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pud_set(mm, addr, pudp, pud);
- }
- static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
- unsigned long addr,
- pmd_t pmd)
- {
- if (static_branch_likely(&page_table_check_disabled))
- return;
- __page_table_check_pte_clear_range(mm, addr, pmd);
- }
- #else
- static inline void page_table_check_alloc(struct page *page, unsigned int order)
- {
- }
- static inline void page_table_check_free(struct page *page, unsigned int order)
- {
- }
- static inline void page_table_check_pte_clear(struct mm_struct *mm,
- unsigned long addr, pte_t pte)
- {
- }
- static inline void page_table_check_pmd_clear(struct mm_struct *mm,
- unsigned long addr, pmd_t pmd)
- {
- }
- static inline void page_table_check_pud_clear(struct mm_struct *mm,
- unsigned long addr, pud_t pud)
- {
- }
- static inline void page_table_check_pte_set(struct mm_struct *mm,
- unsigned long addr, pte_t *ptep,
- pte_t pte)
- {
- }
- static inline void page_table_check_pmd_set(struct mm_struct *mm,
- unsigned long addr, pmd_t *pmdp,
- pmd_t pmd)
- {
- }
- static inline void page_table_check_pud_set(struct mm_struct *mm,
- unsigned long addr, pud_t *pudp,
- pud_t pud)
- {
- }
- static inline void page_table_check_pte_clear_range(struct mm_struct *mm,
- unsigned long addr,
- pmd_t pmd)
- {
- }
- #endif /* CONFIG_PAGE_TABLE_CHECK */
- #endif /* __LINUX_PAGE_TABLE_CHECK_H */
|