diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-11-19 11:21:10 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-12-02 20:29:12 -0500 |
commit | 14cb138d7c1c749d81dc3e66cd70f7a884e1da56 (patch) | |
tree | 6887b6c7763967fae4ddd7f0f305e8799366af45 | |
parent | 9a949e8ff92246c0753b2805c2a001cb991fffe5 (diff) | |
download | linux-14cb138d7c1c749d81dc3e66cd70f7a884e1da56.tar.bz2 |
get_user_pages_unlocked(): pass true to __get_user_pages_locked() notify_drop
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>
-rw-r--r-- | mm/gup.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -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; |