X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=mm%2Fgup.c;h=ddde097cf9e4106bc02ea55538926f44ed8e587c;hb=1ed1fa5f9c311a74f031cabb18a415b4defdfa03;hp=f173fcbaf1b2c9ab40dd65a6b2f3517aa7790ab5;hpb=8164c5719b864da3bcfee97ad8af8cfd7ee5ad8c;p=thirdparty%2Fkernel%2Fstable.git diff --git a/mm/gup.c b/mm/gup.c index f173fcbaf1b2c..ddde097cf9e41 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1042,10 +1042,6 @@ static __always_inline long __get_user_pages_locked(struct task_struct *tsk, BUG_ON(ret >= nr_pages); } - if (!pages) - /* If it's a prefault don't insist harder */ - return ret; - if (ret > 0) { nr_pages -= ret; pages_done += ret; @@ -1061,8 +1057,12 @@ static __always_inline long __get_user_pages_locked(struct task_struct *tsk, pages_done = ret; break; } - /* VM_FAULT_RETRY triggered, so seek to the faulting offset */ - pages += ret; + /* + * VM_FAULT_RETRY triggered, so seek to the faulting offset. + * For the prefault case (!pages) we only update counts. + */ + if (likely(pages)) + pages += ret; start += ret << PAGE_SHIFT; /* @@ -1085,7 +1085,8 @@ static __always_inline long __get_user_pages_locked(struct task_struct *tsk, pages_done++; if (!nr_pages) break; - pages++; + if (likely(pages)) + pages++; start += PAGE_SIZE; } if (lock_dropped && *locked) {