mm: replace get_vaddr_frames() write/force parameters with gup_flags
This removes the 'write' and 'force' from get_vaddr_frames() 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: Michal Hocko <mhocko@suse.com> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
3b913179c3
commit
7f23b3504a
@ -488,7 +488,8 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
|
|||||||
goto err_free;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = get_vaddr_frames(start, npages, true, true, g2d_userptr->vec);
|
ret = get_vaddr_frames(start, npages, FOLL_FORCE | FOLL_WRITE,
|
||||||
|
g2d_userptr->vec);
|
||||||
if (ret != npages) {
|
if (ret != npages) {
|
||||||
DRM_ERROR("failed to get user pages from userptr.\n");
|
DRM_ERROR("failed to get user pages from userptr.\n");
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -214,7 +214,7 @@ static int omap_vout_get_userptr(struct videobuf_buffer *vb, u32 virtp,
|
|||||||
if (!vec)
|
if (!vec)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = get_vaddr_frames(virtp, 1, true, false, vec);
|
ret = get_vaddr_frames(virtp, 1, FOLL_WRITE, vec);
|
||||||
if (ret != 1) {
|
if (ret != 1) {
|
||||||
frame_vector_destroy(vec);
|
frame_vector_destroy(vec);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -42,6 +42,10 @@ struct frame_vector *vb2_create_framevec(unsigned long start,
|
|||||||
unsigned long first, last;
|
unsigned long first, last;
|
||||||
unsigned long nr;
|
unsigned long nr;
|
||||||
struct frame_vector *vec;
|
struct frame_vector *vec;
|
||||||
|
unsigned int flags = FOLL_FORCE;
|
||||||
|
|
||||||
|
if (write)
|
||||||
|
flags |= FOLL_WRITE;
|
||||||
|
|
||||||
first = start >> PAGE_SHIFT;
|
first = start >> PAGE_SHIFT;
|
||||||
last = (start + length - 1) >> PAGE_SHIFT;
|
last = (start + length - 1) >> PAGE_SHIFT;
|
||||||
@ -49,7 +53,7 @@ struct frame_vector *vb2_create_framevec(unsigned long start,
|
|||||||
vec = frame_vector_create(nr);
|
vec = frame_vector_create(nr);
|
||||||
if (!vec)
|
if (!vec)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
ret = get_vaddr_frames(start & PAGE_MASK, nr, write, true, vec);
|
ret = get_vaddr_frames(start & PAGE_MASK, nr, flags, vec);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_destroy;
|
goto out_destroy;
|
||||||
/* We accept only complete set of PFNs */
|
/* We accept only complete set of PFNs */
|
||||||
|
@ -1305,7 +1305,7 @@ struct frame_vector {
|
|||||||
struct frame_vector *frame_vector_create(unsigned int nr_frames);
|
struct frame_vector *frame_vector_create(unsigned int nr_frames);
|
||||||
void frame_vector_destroy(struct frame_vector *vec);
|
void frame_vector_destroy(struct frame_vector *vec);
|
||||||
int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
|
int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
|
||||||
bool write, bool force, struct frame_vector *vec);
|
unsigned int gup_flags, struct frame_vector *vec);
|
||||||
void put_vaddr_frames(struct frame_vector *vec);
|
void put_vaddr_frames(struct frame_vector *vec);
|
||||||
int frame_vector_to_pages(struct frame_vector *vec);
|
int frame_vector_to_pages(struct frame_vector *vec);
|
||||||
void frame_vector_to_pfns(struct frame_vector *vec);
|
void frame_vector_to_pfns(struct frame_vector *vec);
|
||||||
|
@ -11,10 +11,7 @@
|
|||||||
* get_vaddr_frames() - map virtual addresses to pfns
|
* get_vaddr_frames() - map virtual addresses to pfns
|
||||||
* @start: starting user address
|
* @start: starting user address
|
||||||
* @nr_frames: number of pages / pfns from start to map
|
* @nr_frames: number of pages / pfns from start to map
|
||||||
* @write: whether pages will be written to by the caller
|
* @gup_flags: flags modifying lookup behaviour
|
||||||
* @force: whether to force write access even if user mapping is
|
|
||||||
* readonly. See description of the same argument of
|
|
||||||
get_user_pages().
|
|
||||||
* @vec: structure which receives pages / pfns of the addresses mapped.
|
* @vec: structure which receives pages / pfns of the addresses mapped.
|
||||||
* It should have space for at least nr_frames entries.
|
* It should have space for at least nr_frames entries.
|
||||||
*
|
*
|
||||||
@ -34,23 +31,17 @@
|
|||||||
* This function takes care of grabbing mmap_sem as necessary.
|
* This function takes care of grabbing mmap_sem as necessary.
|
||||||
*/
|
*/
|
||||||
int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
|
int get_vaddr_frames(unsigned long start, unsigned int nr_frames,
|
||||||
bool write, bool force, struct frame_vector *vec)
|
unsigned int gup_flags, struct frame_vector *vec)
|
||||||
{
|
{
|
||||||
struct mm_struct *mm = current->mm;
|
struct mm_struct *mm = current->mm;
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int err;
|
int err;
|
||||||
int locked;
|
int locked;
|
||||||
unsigned int gup_flags = 0;
|
|
||||||
|
|
||||||
if (nr_frames == 0)
|
if (nr_frames == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (write)
|
|
||||||
gup_flags |= FOLL_WRITE;
|
|
||||||
if (force)
|
|
||||||
gup_flags |= FOLL_FORCE;
|
|
||||||
|
|
||||||
if (WARN_ON_ONCE(nr_frames > vec->nr_allocated))
|
if (WARN_ON_ONCE(nr_frames > vec->nr_allocated))
|
||||||
nr_frames = vec->nr_allocated;
|
nr_frames = vec->nr_allocated;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user