mm: convert page_table_check_pte_set() to page_table_check_ptes_set()

Tell the page table check how many PTEs & PFNs we want it to check.

Link: https://lkml.kernel.org/r/20230802151406.3735276-3-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
Acked-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2023-08-02 16:13:30 +01:00 committed by Andrew Morton
parent f9bff0e318
commit a379322022
5 changed files with 19 additions and 16 deletions

View File

@ -348,7 +348,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte) pte_t *ptep, pte_t pte)
{ {
page_table_check_pte_set(mm, ptep, pte); page_table_check_ptes_set(mm, ptep, pte, 1);
return __set_pte_at(mm, addr, ptep, pte); return __set_pte_at(mm, addr, ptep, pte);
} }

View File

@ -499,7 +499,7 @@ static inline void __set_pte_at(struct mm_struct *mm,
static inline void set_pte_at(struct mm_struct *mm, static inline void set_pte_at(struct mm_struct *mm,
unsigned long addr, pte_t *ptep, pte_t pteval) unsigned long addr, pte_t *ptep, pte_t pteval)
{ {
page_table_check_pte_set(mm, ptep, pteval); page_table_check_ptes_set(mm, ptep, pteval, 1);
__set_pte_at(mm, addr, ptep, pteval); __set_pte_at(mm, addr, ptep, pteval);
} }

View File

@ -1023,7 +1023,7 @@ static inline pud_t native_local_pudp_get_and_clear(pud_t *pudp)
static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
pte_t *ptep, pte_t pte) pte_t *ptep, pte_t pte)
{ {
page_table_check_pte_set(mm, ptep, pte); page_table_check_ptes_set(mm, ptep, pte, 1);
set_pte(ptep, pte); set_pte(ptep, pte);
} }

View File

@ -17,7 +17,8 @@ void __page_table_check_zero(struct page *page, unsigned int order);
void __page_table_check_pte_clear(struct mm_struct *mm, pte_t pte); void __page_table_check_pte_clear(struct mm_struct *mm, pte_t pte);
void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd); void __page_table_check_pmd_clear(struct mm_struct *mm, pmd_t pmd);
void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud); void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud);
void __page_table_check_pte_set(struct mm_struct *mm, pte_t *ptep, pte_t pte); void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte,
unsigned int nr);
void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd); void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd);
void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud); void __page_table_check_pud_set(struct mm_struct *mm, pud_t *pudp, pud_t pud);
void __page_table_check_pte_clear_range(struct mm_struct *mm, void __page_table_check_pte_clear_range(struct mm_struct *mm,
@ -64,13 +65,13 @@ static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud)
__page_table_check_pud_clear(mm, pud); __page_table_check_pud_clear(mm, pud);
} }
static inline void page_table_check_pte_set(struct mm_struct *mm, pte_t *ptep, static inline void page_table_check_ptes_set(struct mm_struct *mm,
pte_t pte) pte_t *ptep, pte_t pte, unsigned int nr)
{ {
if (static_branch_likely(&page_table_check_disabled)) if (static_branch_likely(&page_table_check_disabled))
return; return;
__page_table_check_pte_set(mm, ptep, pte); __page_table_check_ptes_set(mm, ptep, pte, nr);
} }
static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, static inline void page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp,
@ -123,8 +124,8 @@ static inline void page_table_check_pud_clear(struct mm_struct *mm, pud_t pud)
{ {
} }
static inline void page_table_check_pte_set(struct mm_struct *mm, pte_t *ptep, static inline void page_table_check_ptes_set(struct mm_struct *mm,
pte_t pte) pte_t *ptep, pte_t pte, unsigned int nr)
{ {
} }

View File

@ -182,18 +182,20 @@ void __page_table_check_pud_clear(struct mm_struct *mm, pud_t pud)
} }
EXPORT_SYMBOL(__page_table_check_pud_clear); EXPORT_SYMBOL(__page_table_check_pud_clear);
void __page_table_check_pte_set(struct mm_struct *mm, pte_t *ptep, pte_t pte) void __page_table_check_ptes_set(struct mm_struct *mm, pte_t *ptep, pte_t pte,
unsigned int nr)
{ {
unsigned int i;
if (&init_mm == mm) if (&init_mm == mm)
return; return;
__page_table_check_pte_clear(mm, ptep_get(ptep)); for (i = 0; i < nr; i++)
if (pte_user_accessible_page(pte)) { __page_table_check_pte_clear(mm, ptep_get(ptep + i));
page_table_check_set(pte_pfn(pte), PAGE_SIZE >> PAGE_SHIFT, if (pte_user_accessible_page(pte))
pte_write(pte)); page_table_check_set(pte_pfn(pte), nr, pte_write(pte));
}
} }
EXPORT_SYMBOL(__page_table_check_pte_set); EXPORT_SYMBOL(__page_table_check_ptes_set);
void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd) void __page_table_check_pmd_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd)
{ {