|
@@ -498,6 +498,17 @@ int copy_page_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
|
|
unsigned long addr = vma->vm_start;
|
|
|
unsigned long end = vma->vm_end;
|
|
|
|
|
|
+ /*
|
|
|
+ * Don't copy ptes where a page fault will fill them correctly.
|
|
|
+ * Fork becomes much lighter when there are big shared or private
|
|
|
+ * readonly mappings. The tradeoff is that copy_page_range is more
|
|
|
+ * efficient than faulting.
|
|
|
+ */
|
|
|
+ if (!(vma->vm_flags & (VM_HUGETLB|VM_NONLINEAR|VM_RESERVED))) {
|
|
|
+ if (!vma->anon_vma)
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (is_vm_hugetlb_page(vma))
|
|
|
return copy_hugetlb_page_range(dst_mm, src_mm, vma);
|
|
|
|