lkml.org 
[lkml]   [2023]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 05/36] mm: Add default definition of set_ptes()
    Date
    Most architectures can just define set_pte() and PFN_PTE_SHIFT to
    use this definition. It's also a handy spot to document the guarantees
    provided by the MM.

    Suggested-by: Mike Rapoport (IBM) <rppt@kernel.org>
    Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
    ---
    include/linux/pgtable.h | 37 +++++++++++++++++++++++++++++++++++++
    1 file changed, 37 insertions(+)

    diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h
    index c5a51481bbb9..a755fe94b4b4 100644
    --- a/include/linux/pgtable.h
    +++ b/include/linux/pgtable.h
    @@ -172,6 +172,43 @@ static inline int pmd_young(pmd_t pmd)
    }
    #endif

    +#ifndef set_ptes
    +#ifdef PFN_PTE_SHIFT
    +/**
    + * set_ptes - Map consecutive pages to a contiguous range of addresses.
    + * @mm: Address space to map the pages into.
    + * @addr: Address to map the first page at.
    + * @ptep: Page table pointer for the first entry.
    + * @pte: Page table entry for the first page.
    + * @nr: Number of pages to map.
    + *
    + * May be overridden by the architecture, or the architecture can define
    + * set_pte() and PFN_PTE_SHIFT.
    + *
    + * Context: The caller holds the page table lock. The pages all belong
    + * to the same folio. The PTEs are all in the same PMD.
    + */
    +static inline void set_ptes(struct mm_struct *mm, unsigned long addr,
    + pte_t *ptep, pte_t pte, unsigned int nr)
    +{
    + page_table_check_ptes_set(mm, addr, ptep, pte, nr);
    +
    + for (;;) {
    + set_pte(ptep, pte);
    + if (--nr == 0)
    + break;
    + ptep++;
    + pte = __pte(pte_val(pte) + (1UL << PFN_PTE_SHIFT));
    + }
    +}
    +#ifndef set_pte_at
    +#define set_pte_at(mm, addr, ptep, pte) set_ptes(mm, addr, ptep, pte, 1)
    +#endif
    +#endif
    +#else
    +#define set_pte_at(mm, addr, ptep, pte) set_ptes(mm, addr, ptep, pte, 1)
    +#endif
    +
    #ifndef __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
    extern int ptep_set_access_flags(struct vm_area_struct *vma,
    unsigned long address, pte_t *ptep,
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-03-27 01:00    [W:4.049 / U:25.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site