static inline int
 __scif_dec_pinned_vm_lock(struct mm_struct *mm,
-                         int nr_pages, bool try_lock)
+                         int nr_pages)
 {
        if (!mm || !nr_pages || !scif_ulimit_check)
                return 0;
-       if (try_lock) {
-               if (!down_write_trylock(&mm->mmap_sem)) {
-                       dev_err(scif_info.mdev.this_device,
-                               "%s %d err\n", __func__, __LINE__);
-                       return -1;
-               }
-       } else {
-               down_write(&mm->mmap_sem);
-       }
+
        atomic64_sub(nr_pages, &mm->pinned_vm);
-       up_write(&mm->mmap_sem);
        return 0;
 }
 
        if (!mm || !nr_pages || !scif_ulimit_check)
                return 0;
 
-       locked = nr_pages;
-       locked += atomic64_read(&mm->pinned_vm);
        lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
+       locked = atomic64_add_return(nr_pages, &mm->pinned_vm);
+
        if ((locked > lock_limit) && !capable(CAP_IPC_LOCK)) {
+               atomic64_sub(nr_pages, &mm->pinned_vm);
                dev_err(scif_info.mdev.this_device,
                        "locked(%lu) > lock_limit(%lu)\n",
                        locked, lock_limit);
                return -ENOMEM;
        }
-       atomic64_set(&mm->pinned_vm, locked);
        return 0;
 }
 
 
        might_sleep();
        if (!window->temp && window->mm) {
-               __scif_dec_pinned_vm_lock(window->mm, window->nr_pages, 0);
+               __scif_dec_pinned_vm_lock(window->mm, window->nr_pages);
                __scif_release_mm(window->mm);
                window->mm = NULL;
        }
                                            ep->rma_info.dma_chan);
                } else {
                        if (!__scif_dec_pinned_vm_lock(window->mm,
-                                                      window->nr_pages, 1)) {
+                                                      window->nr_pages)) {
                                __scif_release_mm(window->mm);
                                window->mm = NULL;
                        }
                prot |= SCIF_PROT_WRITE;
 retry:
                mm = current->mm;
-               down_write(&mm->mmap_sem);
                if (ulimit) {
                        err = __scif_check_inc_pinned_vm(mm, nr_pages);
                        if (err) {
-                               up_write(&mm->mmap_sem);
                                pinned_pages->nr_pages = 0;
                                goto error_unmap;
                        }
                }
 
-               pinned_pages->nr_pages = get_user_pages(
+               pinned_pages->nr_pages = get_user_pages_fast(
                                (u64)addr,
                                nr_pages,
                                (prot & SCIF_PROT_WRITE) ? FOLL_WRITE : 0,
-                               pinned_pages->pages,
-                               NULL);
-               up_write(&mm->mmap_sem);
+                               pinned_pages->pages);
                if (nr_pages != pinned_pages->nr_pages) {
                        if (try_upgrade) {
                                if (ulimit)
-                                       __scif_dec_pinned_vm_lock(mm,
-                                                                 nr_pages, 0);
+                                       __scif_dec_pinned_vm_lock(mm, nr_pages);
                                /* Roll back any pinned pages */
                                for (i = 0; i < pinned_pages->nr_pages; i++) {
                                        if (pinned_pages->pages[i])
        return err;
 dec_pinned:
        if (ulimit)
-               __scif_dec_pinned_vm_lock(mm, nr_pages, 0);
+               __scif_dec_pinned_vm_lock(mm, nr_pages);
        /* Something went wrong! Rollback */
 error_unmap:
        pinned_pages->nr_pages = nr_pages;