lkml.org 
[lkml]   [2021]   [Jul]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/7] mm: introduce pte_install() helper
    Date
    Currently we have three times the same few lines repeated in the
    code. Deduplicate them by newly introduced pte_install() helper.

    Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
    ---
    include/linux/mm.h | 1 +
    mm/filemap.c | 11 ++---------
    mm/memory.c | 34 ++++++++++++++++------------------
    3 files changed, 19 insertions(+), 27 deletions(-)

    diff --git a/include/linux/mm.h b/include/linux/mm.h
    index 57453dba41b9..5efd63a20d72 100644
    --- a/include/linux/mm.h
    +++ b/include/linux/mm.h
    @@ -2374,6 +2374,7 @@ static inline spinlock_t *pud_lock(struct mm_struct *mm, pud_t *pud)
    return ptl;
    }

    +extern void pte_install(struct mm_struct *mm, pmd_t *pmd, pgtable_t *pte);
    extern void __init pagecache_init(void);
    extern void __init free_area_init_memoryless_node(int nid);
    extern void free_initmem(void);
    diff --git a/mm/filemap.c b/mm/filemap.c
    index 7b365fdef7a5..4955641f2cf0 100644
    --- a/mm/filemap.c
    +++ b/mm/filemap.c
    @@ -3173,15 +3173,8 @@ static bool filemap_map_pmd(struct vm_fault *vmf, struct page *page)
    }
    }

    - if (pmd_none(*vmf->pmd)) {
    - vmf->ptl = pmd_lock(mm, vmf->pmd);
    - if (likely(pmd_none(*vmf->pmd))) {
    - mm_inc_nr_ptes(mm);
    - pmd_populate(mm, vmf->pmd, vmf->prealloc_pte);
    - vmf->prealloc_pte = NULL;
    - }
    - spin_unlock(vmf->ptl);
    - }
    + if (pmd_none(*vmf->pmd))
    + pte_install(mm, vmf->pmd, &vmf->prealloc_pte);

    /* See comment in handle_pte_fault() */
    if (pmd_devmap_trans_unstable(vmf->pmd)) {
    diff --git a/mm/memory.c b/mm/memory.c
    index 94a17a9a48ab..a0ac4b33e07a 100644
    --- a/mm/memory.c
    +++ b/mm/memory.c
    @@ -433,9 +433,20 @@ void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *vma,
    }
    }

    +void pte_install(struct mm_struct *mm, pmd_t *pmd, pgtable_t *pte)
    +{
    + spinlock_t *ptl = pmd_lock(mm, pmd);
    +
    + if (likely(pmd_none(*pmd))) { /* Has another populated it ? */
    + mm_inc_nr_ptes(mm);
    + pmd_populate(mm, pmd, *pte);
    + *pte = NULL;
    + }
    + spin_unlock(ptl);
    +}
    +
    int __pte_alloc(struct mm_struct *mm, pmd_t *pmd)
    {
    - spinlock_t *ptl;
    pgtable_t new = pte_alloc_one(mm);
    if (!new)
    return -ENOMEM;
    @@ -455,13 +466,7 @@ int __pte_alloc(struct mm_struct *mm, pmd_t *pmd)
    */
    smp_wmb(); /* Could be smp_wmb__xxx(before|after)_spin_lock */

    - ptl = pmd_lock(mm, pmd);
    - if (likely(pmd_none(*pmd))) { /* Has another populated it ? */
    - mm_inc_nr_ptes(mm);
    - pmd_populate(mm, pmd, new);
    - new = NULL;
    - }
    - spin_unlock(ptl);
    + pte_install(mm, pmd, &new);
    if (new)
    pte_free(mm, new);
    return 0;
    @@ -4026,17 +4031,10 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
    return ret;
    }

    - if (vmf->prealloc_pte) {
    - vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd);
    - if (likely(pmd_none(*vmf->pmd))) {
    - mm_inc_nr_ptes(vma->vm_mm);
    - pmd_populate(vma->vm_mm, vmf->pmd, vmf->prealloc_pte);
    - vmf->prealloc_pte = NULL;
    - }
    - spin_unlock(vmf->ptl);
    - } else if (unlikely(pte_alloc(vma->vm_mm, vmf->pmd))) {
    + if (vmf->prealloc_pte)
    + pte_install(vma->vm_mm, vmf->pmd, &vmf->prealloc_pte);
    + else if (unlikely(pte_alloc(vma->vm_mm, vmf->pmd)))
    return VM_FAULT_OOM;
    - }
    }

    /* See comment in handle_pte_fault() */
    --
    2.11.0
    \
     
     \ /
      Last update: 2021-07-18 06:31    [W:2.339 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site