diff --git a/mm/gup.c b/mm/gup.c index 98f13ab37bac..3bc25fd44433 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -1241,14 +1242,23 @@ long populate_vma_page_range(struct vm_area_struct *vma, int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) { struct mm_struct *mm = current->mm; - unsigned long end, nstart, nend; + unsigned long end, nstart, nend = 0L; struct vm_area_struct *vma = NULL; int locked = 0; long ret = 0; + unsigned long nstart_prev = 0L - 1L, nend_prev = 0L - 1L; + int ign; end = start + len; + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d ENTER\n", start, len, end, ignore_errors); + for (nstart = start; nstart < end; nstart = nend) { + ign = nstart == nstart_prev && nend == nend_prev; + nstart_prev = nstart; + nend_prev = nend; + if (!ign) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP %lx %d %ld\n", start, len, end, ignore_errors, nstart, locked, ret); /* * We want to fault in pages for [nstart; end) address range. * Find first corresponding VMA. @@ -1259,6 +1269,8 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) vma = find_vma(mm, nstart); } else if (nstart >= vma->vm_end) vma = vma->vm_next; + if (!ign && vma) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d vma->vm_start=%lx vma->vm_end=%lx vma->vm_flags=%lx\n", start, len, end, ignore_errors, vma->vm_start, vma->vm_end, vma->vm_flags); if (!vma || vma->vm_start >= end) break; /* @@ -1266,8 +1278,13 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) * range with the first VMA. Also, skip undesirable VMA types. */ nend = min(end, vma->vm_end); - if (vma->vm_flags & (VM_IO | VM_PFNMAP)) - continue; + if (!ign) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d nend=%lx %lx %lx\n", start, len, end, ignore_errors, nend, end, vma->vm_end); + if (vma->vm_flags & (VM_IO | VM_PFNMAP)) { + if (!ign) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-1 %lx\n", start, len, end, ignore_errors, vma->vm_flags); + continue; + } if (nstart < vma->vm_start) nstart = vma->vm_start; /* @@ -1277,6 +1294,8 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) */ ret = populate_vma_page_range(vma, nstart, nend, &locked); if (ret < 0) { + if (!ign) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-2 %ld\n", start, len, end, ignore_errors, ret); if (ignore_errors) { ret = 0; continue; /* continue at next VMA */ @@ -1284,8 +1303,11 @@ int __mm_populate(unsigned long start, unsigned long len, int ignore_errors) break; } nend = nstart + ret * PAGE_SIZE; + if (!ign) + printk(KERN_WARNING "_mm_populate %lx %lx %lx %d LOOP-3 ret=%ld nend=%lx\n", start, len, end, ignore_errors, ret, nend); ret = 0; } + printk(KERN_WARNING "_mm_populate END %lu %lu %d\n", start, len, locked); if (locked) up_read(&mm->mmap_sem); return ret; /* 0 or negative error code */