572 spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING);
573 arch_enter_lazy_mmu_mode();
574
575 do {
576
577
578
579
580 if (progress >= 32) {
581 progress = 0;
582 if (need_resched() ||
583 spin_needbreak(src_ptl) || spin_needbreak(dst_ptl))
584 break;
585 }
586 if (pte_none(*src_pte)) {
587 progress++;
588 continue;
589 }
590 copy_one_pte(dst_mm, src_mm, dst_pte, src_pte, vma, addr, rss);
591 progress += 8;
592 } while (dst_pte++, src_pte++, addr += PAGE_SIZE, addr != end);
593
594 arch_leave_lazy_mmu_mode();
595 spin_unlock(src_ptl);
596 pte_unmap_nested(src_pte - 1);
597 add_mm_rss(dst_mm, rss[0], rss[1]);
598 pte_unmap_unlock(dst_pte - 1, dst_ptl);
599 cond_resched();
600 if (addr != end)
601 goto again;
602 return 0;
603}
604
605static inline int copy_pmd_range(struct mm_struct *dst_mm, struct mm_struct *src_mm,
606 pud_t *dst_pud, pud_t *src_pud, struct vm_area_struct *vma,
607 unsigned long addr, unsigned long end)
608{
609 pmd_t *src_pmd, *dst_pmd;
610 unsigned long next;
611
612 dst_pmd = pmd_alloc(dst_mm, dst_pud, addr);