[RFC PATCH 3/6] mm, pgtable: Add ownership for the PTE table

Chih-En Lin
2022-05-19T18:30:25Z

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@gmail.com>
---
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