lkml.org 
[lkml]   [2023]   [Feb]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 01/34] mm: Convert page_table_check_pte_set() to page_table_check_ptes_set()
    Date
    Tell the page table check how many PTEs & PFNs we want it to check.

    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    ---
    arch/arm64/include/asm/pgtable.h | 2 +-
    arch/riscv/include/asm/pgtable.h | 2 +-
    arch/x86/include/asm/pgtable.h | 2 +-
    include/linux/page_table_check.h | 14 +++++++-------
    mm/page_table_check.c | 14 ++++++++------
    5 files changed, 18 insertions(+), 16 deletions(-)

    diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
    index b6ba466e2e8a..69765dc697af 100644
    --- a/arch/arm64/include/asm/pgtable.h
    +++ b/arch/arm64/include/asm/pgtable.h
    @@ -358,7 +358,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,
    pte_t *ptep, pte_t pte)
    {
    - page_table_check_pte_set(mm, addr, ptep, pte);
    + page_table_check_ptes_set(mm, addr, ptep, pte, 1);
    return __set_pte_at(mm, addr, ptep, pte);
    }

    diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h
    index ab05f892d317..b516f3b59616 100644
    --- a/arch/riscv/include/asm/pgtable.h
    +++ b/arch/riscv/include/asm/pgtable.h
    @@ -459,7 +459,7 @@ 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)
    {
    - page_table_check_pte_set(mm, addr, ptep, pteval);
    + page_table_check_ptes_set(mm, addr, ptep, pteval, 1);
    __set_pte_at(mm, addr, ptep, pteval);
    }

    diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
    index 7425f32e5293..84be3e07b112 100644
    --- a/arch/x86/include/asm/pgtable.h
    +++ b/arch/x86/include/asm/pgtable.h
    @@ -1022,7 +1022,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,
    pte_t *ptep, pte_t pte)
    {
    - page_table_check_pte_set(mm, addr, ptep, pte);
    + page_table_check_ptes_set(mm, addr, ptep, pte, 1);
    set_pte(ptep, pte);
    }

    diff --git a/include/linux/page_table_check.h b/include/linux/page_table_check.h
    index 01e16c7696ec..ba269c7009e4 100644
    --- a/include/linux/page_table_check.h
    +++ b/include/linux/page_table_check.h
    @@ -20,8 +20,8 @@ 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_ptes_set(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep, pte_t pte, unsigned int nr);
    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,
    @@ -73,14 +73,14 @@ static inline void page_table_check_pud_clear(struct mm_struct *mm,
    __page_table_check_pud_clear(mm, addr, pud);
    }

    -static inline void page_table_check_pte_set(struct mm_struct *mm,
    +static inline void page_table_check_ptes_set(struct mm_struct *mm,
    unsigned long addr, pte_t *ptep,
    - pte_t pte)
    + pte_t pte, unsigned int nr)
    {
    if (static_branch_likely(&page_table_check_disabled))
    return;

    - __page_table_check_pte_set(mm, addr, ptep, pte);
    + __page_table_check_ptes_set(mm, addr, ptep, pte, nr);
    }

    static inline void page_table_check_pmd_set(struct mm_struct *mm,
    @@ -138,9 +138,9 @@ static inline void page_table_check_pud_clear(struct mm_struct *mm,
    {
    }

    -static inline void page_table_check_pte_set(struct mm_struct *mm,
    +static inline void page_table_check_ptes_set(struct mm_struct *mm,
    unsigned long addr, pte_t *ptep,
    - pte_t pte)
    + pte_t pte, unsigned int nr)
    {
    }

    diff --git a/mm/page_table_check.c b/mm/page_table_check.c
    index 25d8610c0042..e6f4d40caaa2 100644
    --- a/mm/page_table_check.c
    +++ b/mm/page_table_check.c
    @@ -184,20 +184,22 @@ void __page_table_check_pud_clear(struct mm_struct *mm, unsigned long addr,
    }
    EXPORT_SYMBOL(__page_table_check_pud_clear);

    -void __page_table_check_pte_set(struct mm_struct *mm, unsigned long addr,
    - pte_t *ptep, pte_t pte)
    +void __page_table_check_ptes_set(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep, pte_t pte, unsigned int nr)
    {
    + unsigned int i;
    +
    if (&init_mm == mm)
    return;

    - __page_table_check_pte_clear(mm, addr, *ptep);
    + for (i = 0; i < nr; i++)
    + __page_table_check_pte_clear(mm, addr, ptep[i]);
    if (pte_user_accessible_page(pte)) {
    - page_table_check_set(mm, addr, pte_pfn(pte),
    - PAGE_SIZE >> PAGE_SHIFT,
    + page_table_check_set(mm, addr, 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, unsigned long addr,
    pmd_t *pmdp, pmd_t pmd)
    --
    2.39.1
    \
     
     \ /
      Last update: 2023-03-27 00:38    [W:4.885 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site