On Thu, 3 Apr 2014 17:35:21 +0300 "Kirill A. Shutemov" <kirill.shutemov@xxxxxxxxxxxxxxx> wrote: > Nesting level in __get_user_pages() is just insane. Let's try to fix it > a bit. > > --- a/mm/gup.c > +++ b/mm/gup.c > @@ -388,69 +443,22 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, > while (!(page = follow_page_mask(vma, start, > foll_flags, &page_mask))) { > int ret; > - unsigned int fault_flags = 0; > - > - /* For mlock, just skip the stack guard page. */ > - if (foll_flags & FOLL_MLOCK) { > - if (stack_guard_page(vma, start)) > - goto next_page; > - } > - if (foll_flags & FOLL_WRITE) > - fault_flags |= FAULT_FLAG_WRITE; > - if (nonblocking) > - fault_flags |= FAULT_FLAG_ALLOW_RETRY; > - if (foll_flags & FOLL_NOWAIT) > - fault_flags |= (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT); > - > - ret = handle_mm_fault(mm, vma, start, > - fault_flags); > - > - if (ret & VM_FAULT_ERROR) { > - if (ret & VM_FAULT_OOM) > - return i ? i : -ENOMEM; > - if (ret & (VM_FAULT_HWPOISON | > - VM_FAULT_HWPOISON_LARGE)) { > - if (i) > - return i; > - else if (gup_flags & FOLL_HWPOISON) > - return -EHWPOISON; > - else > - return -EFAULT; > - } > - if (ret & VM_FAULT_SIGBUS) > - return i ? i : -EFAULT; > - BUG(); > - } > - > - if (tsk) { > - if (ret & VM_FAULT_MAJOR) > - tsk->maj_flt++; > - else > - tsk->min_flt++; > - } > - > - if (ret & VM_FAULT_RETRY) { > - if (nonblocking) > - *nonblocking = 0; > + ret = faultin_page(tsk, vma, start, &foll_flags, > + nonblocking); > + switch (ret) { > + case 0: > + break; > + case -EFAULT: > + case -ENOMEM: > + case -EHWPOISON: > + return i ? i : ret; > + case -EBUSY: > return i; > + case -ENOENT: > + goto next_page; > + default: > + BUILD_BUG(); hm, why the BUILD_BUG? It triggers all the time. I'll switch it to BUG but I worry about how this passed your testing. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>