nv_mmap_read_unlock(mm);
if (pages_pinned < 0 || (unsigned)pages_pinned < pages_count) {
-diff --git a/kernel/nvidia-uvm/uvm8_tools.c b/kernel/nvidia-uvm/uvm8_tools.c
-index 1dc7c97d..ea521945 100644
---- a/kernel/nvidia-uvm/uvm8_tools.c
-+++ b/kernel/nvidia-uvm/uvm8_tools.c
-@@ -251,13 +251,37 @@ static NV_STATUS map_user_pages(NvU64 user_va, NvU64 size, void **addr, struct p
- }
-
- nv_mmap_read_lock(current->mm);
-+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
-+ ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages);
-+#else
- ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages, vmas);
-+#endif
- nv_mmap_read_unlock(current->mm);
- if (ret != num_pages) {
- status = NV_ERR_INVALID_ARGUMENT;
- goto fail;
- }
-
-+#if defined(NV_GET_USER_PAGES_DROPPED_VMA)
-+ struct vm_area_struct *vma;
-+ unsigned long start;
-+
-+ nv_mmap_read_lock(current->mm);
-+ start = user_va;
-+ for (i = 0; i < num_pages; i++) {
-+ vma = find_vma(current->mm, start);
-+ if (!vma) {
-+ nv_mmap_read_unlock(current->mm);
-+ status = NV_ERR_INVALID_ARGUMENT;
-+ goto fail;
-+ }
-+
-+ vmas[i] = vma;
-+ start = (start + PAGE_SIZE) & PAGE_MASK;
-+ }
-+ nv_mmap_read_unlock(current->mm);
-+#endif
-+
- for (i = 0; i < num_pages; i++) {
- if (page_count((*pages)[i]) > MAX_PAGE_COUNT || uvm_file_is_nvidia_uvm(vmas[i]->vm_file)) {
- status = NV_ERR_INVALID_ARGUMENT;
diff --git a/kernel/nvidia/os-mlock.c b/kernel/nvidia/os-mlock.c
index f88daed4..ad5cb9a1 100644
--- a/kernel/nvidia/os-mlock.c