Message ID | 1412356087-16115-2-git-send-email-aarcange@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
This needs more explanation than that one-liner comment. Make the commit message explain why the new FOLL_TRIED flag exists. Linus On Fri, Oct 3, 2014 at 10:07 AM, Andrea Arcangeli <aarcange@redhat.com> wrote: > From: Andres Lagar-Cavilla <andreslc@google.com> > > Reviewed-by: Radim Kr?má? <rkrcmar@redhat.com> > Signed-off-by: Andres Lagar-Cavilla <andreslc@google.com> > Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> This needs more explanation than that one-liner comment. Make the > commit message explain why the new FOLL_TRIED flag exists. This patch actually is extracted from a 3.18 commit in the KVM tree, https://git.kernel.org/cgit/virt/kvm/kvm.git/commit/?h=next&id=234b239b. Here is how that patch uses the flag: /* * The previous call has now waited on the IO. Now we can * retry and complete. Pass TRIED to ensure we do not re * schedule async IO (see e.g. filemap_fault). */ down_read(&mm->mmap_sem); npages = __get_user_pages(tsk, mm, addr, 1, flags | FOLL_TRIED, pagep, NULL, NULL); -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/mm.h b/include/linux/mm.h index 8981cc8..0f4196a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1985,6 +1985,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, #define FOLL_HWPOISON 0x100 /* check page is hwpoisoned */ #define FOLL_NUMA 0x200 /* force NUMA hinting page fault */ #define FOLL_MIGRATION 0x400 /* wait for page to replace migration entry */ +#define FOLL_TRIED 0x800 /* a retry, previous pass started an IO */ typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr, void *data); diff --git a/mm/gup.c b/mm/gup.c index 91d044b..af7ea3e 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -281,6 +281,10 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, fault_flags |= FAULT_FLAG_ALLOW_RETRY; if (*flags & FOLL_NOWAIT) fault_flags |= FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_RETRY_NOWAIT; + if (*flags & FOLL_TRIED) { + VM_WARN_ON_ONCE(fault_flags & FAULT_FLAG_ALLOW_RETRY); + fault_flags |= FAULT_FLAG_TRIED; + } ret = handle_mm_fault(mm, vma, address, fault_flags); if (ret & VM_FAULT_ERROR) {