File pmds can be safely skip on copy_huge_pmd(), we can re-fault them
later. COW for file mappings handled on pte level.

Signed-off-by: Kirill A. Shutemov <[email protected]>
---
 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 4da4e915af61..00f10d323039 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1052,14 +1052,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);
@@ -1067,7 +1068,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;
        }
@@ -1090,16 +1091,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

Reply via email to