|
@@ -3704,7 +3704,6 @@ static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
if (unlikely(is_vm_hugetlb_page(vma)))
|
|
|
return hugetlb_fault(mm, vma, address, flags);
|
|
|
|
|
|
-retry:
|
|
|
pgd = pgd_offset(mm, address);
|
|
|
pud = pud_alloc(mm, pgd, address);
|
|
|
if (!pud)
|
|
@@ -3742,20 +3741,13 @@ retry:
|
|
|
if (dirty && !pmd_write(orig_pmd)) {
|
|
|
ret = do_huge_pmd_wp_page(mm, vma, address, pmd,
|
|
|
orig_pmd);
|
|
|
- /*
|
|
|
- * If COW results in an oom, the huge pmd will
|
|
|
- * have been split, so retry the fault on the
|
|
|
- * pte for a smaller charge.
|
|
|
- */
|
|
|
- if (unlikely(ret & VM_FAULT_OOM))
|
|
|
- goto retry;
|
|
|
- return ret;
|
|
|
+ if (!(ret & VM_FAULT_FALLBACK))
|
|
|
+ return ret;
|
|
|
} else {
|
|
|
huge_pmd_set_accessed(mm, vma, address, pmd,
|
|
|
orig_pmd, dirty);
|
|
|
+ return 0;
|
|
|
}
|
|
|
-
|
|
|
- return 0;
|
|
|
}
|
|
|
}
|
|
|
|