|
|
@@ -1098,14 +1098,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);
|
|
|
@@ -1113,7 +1114,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;
|
|
|
}
|
|
|
@@ -1136,16 +1137,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));
|