down_read(&mm->mmap_sem);
                                        locked = 1;
                                }
-                               ret = get_user_pages_remote
+                               ret = pin_user_pages_remote
                                        (work->task, mm,
                                         obj->userptr.ptr + pinned * PAGE_SIZE,
                                         npages - pinned,
        }
        mutex_unlock(&obj->mm.lock);
 
-       release_pages(pvec, pinned);
+       unpin_user_pages(pvec, pinned);
        kvfree(pvec);
 
        i915_gem_object_put(obj);
        struct sg_table *pages;
        bool active;
        int pinned;
+       unsigned int gup_flags = 0;
 
        /* If userspace should engineer that these pages are replaced in
         * the vma between us binding this page into the GTT and completion
                 *
                 * We may or may not care.
                 */
-               if (pvec) /* defer to worker if malloc fails */
-                       pinned = __get_user_pages_fast(obj->userptr.ptr,
-                                                      num_pages,
-                                                      !i915_gem_object_is_readonly(obj),
-                                                      pvec);
+               if (pvec) {
+                       /* defer to worker if malloc fails */
+                       if (!i915_gem_object_is_readonly(obj))
+                               gup_flags |= FOLL_WRITE;
+                       pinned = pin_user_pages_fast_only(obj->userptr.ptr,
+                                                         num_pages, gup_flags,
+                                                         pvec);
+               }
        }
 
        active = false;
                __i915_gem_userptr_set_active(obj, true);
 
        if (IS_ERR(pages))
-               release_pages(pvec, pinned);
+               unpin_user_pages(pvec, pinned);
        kvfree(pvec);
 
        return PTR_ERR_OR_ZERO(pages);
                }
 
                mark_page_accessed(page);
-               put_page(page);
+               unpin_user_page(page);
        }
        obj->mm.dirty = false;