Introduce the ownership for the PTE table to prepare the following patch of the Copy-On-Write (COW) page table. It uses the address of PMD index to become the owner to identify which process can update its page table state from the COW page table. Signed-off-by: Chih-En Lin <shiyn.lin@xxxxxxxxx> --- include/linux/mm.h | 1 + include/linux/mm_types.h | 1 + include/linux/pgtable.h | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/include/linux/mm.h b/include/linux/mm.h index 9f44254af8ce..221926a3d818 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2328,6 +2328,7 @@ static inline bool pgtable_pte_page_ctor(struct page *page) return false; __SetPageTable(page); inc_lruvec_page_state(page, NR_PAGETABLE); + page->cow_pte_owner = NULL; return true; } diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 8834e38c06a4..5dcbd7f6c361 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -221,6 +221,7 @@ struct page { #ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS int _last_cpupid; #endif + pmd_t *cow_pte_owner; /* cow pte: pmd */ } _struct_page_alignment; /** diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index f4f4077b97aa..faca57af332e 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -590,6 +590,20 @@ static inline int pte_unused(pte_t pte) } #endif +static inline bool set_cow_pte_owner(pmd_t *pmd, pmd_t *owner) +{ + struct page *page = pmd_page(*pmd); + + smp_store_release(&page->cow_pte_owner, owner); + return true; +} + +static inline bool cow_pte_owner_is_same(pmd_t *pmd, pmd_t *owner) +{ + return (smp_load_acquire(&pmd_page(*pmd)->cow_pte_owner) == owner) ? + true : false; +} + #ifndef pte_access_permitted #define pte_access_permitted(pte, write) \ (pte_present(pte) && (!(write) || pte_write(pte))) -- 2.36.1