lkml.org 
[lkml]   [2016]   [Mar]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv4 12/25] thp: skip file huge pmd on copy_huge_pmd()
    Date
    copy_page_range() has a check for "Don't copy ptes where a page fault
    will fill them correctly." It works on VMA level. We still copy all page
    table entries from private mappings, even if they map page cache.

    We can simplify copy_huge_pmd() a bit by skipping file PMDs.

    We don't map file private pages with PMDs, so they only can map page
    cache. It's safe to skip them as they can be re-faulted later.

    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    ---
    mm/huge_memory.c | 34 ++++++++++++++++------------------
    1 file changed, 16 insertions(+), 18 deletions(-)

    diff --git a/mm/huge_memory.c b/mm/huge_memory.c
    index 51c54d5a945b..0ef06d47bd24 100644
    --- a/mm/huge_memory.c
    +++ b/mm/huge_memory.c
    @@ -1082,14 +1082,15 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
    struct page *src_page;
    pmd_t pmd;
    pgtable_t pgtable = NULL;
    - int ret;
    + int ret = -ENOMEM;

    - if (!vma_is_dax(vma)) {
    - ret = -ENOMEM;
    - pgtable = pte_alloc_one(dst_mm, addr);
    - if (unlikely(!pgtable))
    - goto out;
    - }
    + /* Skip if can be re-fill on fault */
    + if (!vma_is_anonymous(vma))
    + return 0;
    +
    + pgtable = pte_alloc_one(dst_mm, addr);
    + if (unlikely(!pgtable))
    + goto out;

    dst_ptl = pmd_lock(dst_mm, dst_pmd);
    src_ptl = pmd_lockptr(src_mm, src_pmd);
    @@ -1097,7 +1098,7 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,

    ret = -EAGAIN;
    pmd = *src_pmd;
    - if (unlikely(!pmd_trans_huge(pmd) && !pmd_devmap(pmd))) {
    + if (unlikely(!pmd_trans_huge(pmd))) {
    pte_free(dst_mm, pgtable);
    goto out_unlock;
    }
    @@ -1120,16 +1121,13 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
    goto out_unlock;
    }

    - if (!vma_is_dax(vma)) {
    - /* thp accounting separate from pmd_devmap accounting */
    - src_page = pmd_page(pmd);
    - VM_BUG_ON_PAGE(!PageHead(src_page), src_page);
    - get_page(src_page);
    - page_dup_rmap(src_page, true);
    - add_mm_counter(dst_mm, MM_ANONPAGES, HPAGE_PMD_NR);
    - atomic_long_inc(&dst_mm->nr_ptes);
    - pgtable_trans_huge_deposit(dst_mm, dst_pmd, pgtable);
    - }
    + src_page = pmd_page(pmd);
    + VM_BUG_ON_PAGE(!PageHead(src_page), src_page);
    + get_page(src_page);
    + page_dup_rmap(src_page, true);
    + add_mm_counter(dst_mm, MM_ANONPAGES, HPAGE_PMD_NR);
    + atomic_long_inc(&dst_mm->nr_ptes);
    + pgtable_trans_huge_deposit(dst_mm, dst_pmd, pgtable);

    pmdp_set_wrprotect(src_mm, addr, src_pmd);
    pmd = pmd_mkold(pmd_wrprotect(pmd));
    --
    2.7.0
    \
     
     \ /
      Last update: 2016-03-12 00:41    [W:4.199 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site