@@ -34,6 +34,7 @@ config X86_64
select SWIOTLB
select ARCH_HAS_ELFCORE_COMPAT
select ZONE_DMA32
+ select ARCH_SUPPORTS_FREE_USER_PTE
config FORCE_DYNAMIC_FTRACE
def_bool y
@@ -23,6 +23,7 @@
#include <asm/coco.h>
#include <asm-generic/pgtable_uffd.h>
#include <linux/page_table_check.h>
+#include <linux/pte_ref.h>
extern pgd_t early_top_pgt[PTRS_PER_PGD];
bool __init __early_make_pgtable(unsigned long address, pmdval_t pmd);
@@ -1010,6 +1011,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte)
{
page_table_check_pte_set(mm, addr, ptep, pte);
+ track_pte_set(mm, addr, ptep, pte);
set_pte(ptep, pte);
}
@@ -1055,6 +1057,7 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
{
pte_t pte = native_ptep_get_and_clear(ptep);
page_table_check_pte_clear(mm, addr, pte);
+ track_pte_clear(mm, addr, ptep, pte);
return pte;
}
@@ -1071,6 +1074,7 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
*/
pte = native_local_ptep_get_and_clear(ptep);
page_table_check_pte_clear(mm, addr, pte);
+ track_pte_clear(mm, addr, ptep, pte);
} else {
pte = ptep_get_and_clear(mm, addr, ptep);
}
@@ -1081,7 +1085,8 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
static inline void ptep_clear(struct mm_struct *mm, unsigned long addr,
pte_t *ptep)
{
- if (IS_ENABLED(CONFIG_PAGE_TABLE_CHECK))
+ if (IS_ENABLED(CONFIG_PAGE_TABLE_CHECK)
+ || IS_ENABLED(CONFIG_FREE_USER_PTE))
ptep_get_and_clear(mm, addr, ptep);
else
pte_clear(mm, addr, ptep);
Add pte_ref hooks into routines that modify user PTE page tables, and select ARCH_SUPPORTS_FREE_USER_PTE, so that the pte_ref code can be compiled and worked on this architecture. Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com> --- arch/x86/Kconfig | 1 + arch/x86/include/asm/pgtable.h | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-)