Merge tag 'mm-stable-2022-12-13' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / drivers / gpu / drm / etnaviv / etnaviv_gem.c
index 68e4446a94ad7c955d8d5ca5c05871d0952c8cc2..c5ae5492e1af066e5ddcdc760fc8b13647c0efa7 100644 (file)
@@ -643,6 +643,7 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj)
        struct page **pvec = NULL;
        struct etnaviv_gem_userptr *userptr = &etnaviv_obj->userptr;
        int ret, pinned = 0, npages = etnaviv_obj->base.size >> PAGE_SHIFT;
+       unsigned int gup_flags = FOLL_LONGTERM;
 
        might_lock_read(&current->mm->mmap_lock);
 
@@ -653,14 +654,15 @@ static int etnaviv_gem_userptr_get_pages(struct etnaviv_gem_object *etnaviv_obj)
        if (!pvec)
                return -ENOMEM;
 
+       if (!userptr->ro)
+               gup_flags |= FOLL_WRITE;
+
        do {
                unsigned num_pages = npages - pinned;
                uint64_t ptr = userptr->ptr + pinned * PAGE_SIZE;
                struct page **pages = pvec + pinned;
 
-               ret = pin_user_pages_fast(ptr, num_pages,
-                                         FOLL_WRITE | FOLL_FORCE | FOLL_LONGTERM,
-                                         pages);
+               ret = pin_user_pages_fast(ptr, num_pages, gup_flags, pages);
                if (ret < 0) {
                        unpin_user_pages(pvec, pinned);
                        kvfree(pvec);