]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
get_user_pages_unlocked(): pass true to __get_user_pages_locked() notify_drop
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 19 Nov 2017 16:21:10 +0000 (11:21 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 3 Dec 2017 01:29:12 +0000 (20:29 -0500)
Equivalent transformation - the only place in __get_user_pages_locked()
where we look at notify_drop argument is
if (notify_drop && lock_dropped && *locked) {
up_read(&mm->mmap_sem);
*locked = 0;
}
in the very end.  Changing notify_drop from false to true won't change
behaviour unless *locked is non-zero.  The caller is
        ret = __get_user_pages_locked(current, mm, start, nr_pages, pages, NULL,
      &locked, false, gup_flags | FOLL_TOUCH);
if (locked)
up_read(&mm->mmap_sem);
so in that case the original kernel would have done up_read() right after
return from __get_user_pages_locked(), while the modified one would've done
it right before the return.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
mm/gup.c

index e7b9f5e97479f54bdb2ebacd122f04a0365f6a94..9418cbb3b1adfbad8783f56fb5e3823161ea94c1 100644 (file)
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -988,7 +988,7 @@ long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages,
 
        down_read(&mm->mmap_sem);
        ret = __get_user_pages_locked(current, mm, start, nr_pages, pages, NULL,
-                                     &locked, false, gup_flags | FOLL_TOUCH);
+                                     &locked, true, gup_flags | FOLL_TOUCH);
        if (locked)
                up_read(&mm->mmap_sem);
        return ret;