diff options
author | Lorenzo Stoakes <lstoakes@gmail.com> | 2016-10-12 20:20:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-10-19 11:11:43 -0400 |
commit | 768ae309a96103ed02eb1e111e838c87854d8b51 (patch) | |
tree | 59f9070c68cc87d37e5edf6439b5074a96f5d3dd /mm | |
parent | 7f23b3504a0df63b724180262c5f3f117f21bcae (diff) |
mm: replace get_user_pages() write/force parameters with gup_flags
This removes the 'write' and 'force' from get_user_pages() and replaces
them with 'gup_flags' to make the use of FOLL_FORCE explicit in callers
as use of this flag can result in surprising behaviour (and hence bugs)
within the mm subsystem.
Signed-off-by: Lorenzo Stoakes <lstoakes@gmail.com>
Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r-- | mm/gup.c | 12 | ||||
-rw-r--r-- | mm/mempolicy.c | 2 | ||||
-rw-r--r-- | mm/nommu.c | 18 |
3 files changed, 8 insertions, 24 deletions
@@ -987,18 +987,12 @@ EXPORT_SYMBOL(get_user_pages_remote); | |||
987 | * obviously don't pass FOLL_REMOTE in here. | 987 | * obviously don't pass FOLL_REMOTE in here. |
988 | */ | 988 | */ |
989 | long get_user_pages(unsigned long start, unsigned long nr_pages, | 989 | long get_user_pages(unsigned long start, unsigned long nr_pages, |
990 | int write, int force, struct page **pages, | 990 | unsigned int gup_flags, struct page **pages, |
991 | struct vm_area_struct **vmas) | 991 | struct vm_area_struct **vmas) |
992 | { | 992 | { |
993 | unsigned int flags = FOLL_TOUCH; | ||
994 | |||
995 | if (write) | ||
996 | flags |= FOLL_WRITE; | ||
997 | if (force) | ||
998 | flags |= FOLL_FORCE; | ||
999 | |||
1000 | return __get_user_pages_locked(current, current->mm, start, nr_pages, | 993 | return __get_user_pages_locked(current, current->mm, start, nr_pages, |
1001 | pages, vmas, NULL, false, flags); | 994 | pages, vmas, NULL, false, |
995 | gup_flags | FOLL_TOUCH); | ||
1002 | } | 996 | } |
1003 | EXPORT_SYMBOL(get_user_pages); | 997 | EXPORT_SYMBOL(get_user_pages); |
1004 | 998 | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index ad1c96ac313c..0b859af06b87 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
@@ -850,7 +850,7 @@ static int lookup_node(unsigned long addr) | |||
850 | struct page *p; | 850 | struct page *p; |
851 | int err; | 851 | int err; |
852 | 852 | ||
853 | err = get_user_pages(addr & PAGE_MASK, 1, 0, 0, &p, NULL); | 853 | err = get_user_pages(addr & PAGE_MASK, 1, 0, &p, NULL); |
854 | if (err >= 0) { | 854 | if (err >= 0) { |
855 | err = page_to_nid(p); | 855 | err = page_to_nid(p); |
856 | put_page(p); | 856 | put_page(p); |
diff --git a/mm/nommu.c b/mm/nommu.c index 842cfdd1a31e..70cb844dfd95 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -160,18 +160,11 @@ finish_or_fault: | |||
160 | * - don't permit access to VMAs that don't support it, such as I/O mappings | 160 | * - don't permit access to VMAs that don't support it, such as I/O mappings |
161 | */ | 161 | */ |
162 | long get_user_pages(unsigned long start, unsigned long nr_pages, | 162 | long get_user_pages(unsigned long start, unsigned long nr_pages, |
163 | int write, int force, struct page **pages, | 163 | unsigned int gup_flags, struct page **pages, |
164 | struct vm_area_struct **vmas) | 164 | struct vm_area_struct **vmas) |
165 | { | 165 | { |
166 | int flags = 0; | 166 | return __get_user_pages(current, current->mm, start, nr_pages, |
167 | 167 | gup_flags, pages, vmas, NULL); | |
168 | if (write) | ||
169 | flags |= FOLL_WRITE; | ||
170 | if (force) | ||
171 | flags |= FOLL_FORCE; | ||
172 | |||
173 | return __get_user_pages(current, current->mm, start, nr_pages, flags, | ||
174 | pages, vmas, NULL); | ||
175 | } | 168 | } |
176 | EXPORT_SYMBOL(get_user_pages); | 169 | EXPORT_SYMBOL(get_user_pages); |
177 | 170 | ||
@@ -179,10 +172,7 @@ long get_user_pages_locked(unsigned long start, unsigned long nr_pages, | |||
179 | unsigned int gup_flags, struct page **pages, | 172 | unsigned int gup_flags, struct page **pages, |
180 | int *locked) | 173 | int *locked) |
181 | { | 174 | { |
182 | int write = gup_flags & FOLL_WRITE; | 175 | return get_user_pages(start, nr_pages, gup_flags, pages, NULL); |
183 | int force = gup_flags & FOLL_FORCE; | ||
184 | |||
185 | return get_user_pages(start, nr_pages, write, force, pages, NULL); | ||
186 | } | 176 | } |
187 | EXPORT_SYMBOL(get_user_pages_locked); | 177 | EXPORT_SYMBOL(get_user_pages_locked); |
188 | 178 | ||