goto err_free;
        }
 
+       down_read(¤t->mm->mmap_sem);
        vma = find_vma(current->mm, userptr);
        if (!vma) {
+               up_read(¤t->mm->mmap_sem);
                DRM_ERROR("failed to get vm region.\n");
                ret = -EFAULT;
                goto err_free_pages;
        }
 
        if (vma->vm_end < userptr + size) {
+               up_read(¤t->mm->mmap_sem);
                DRM_ERROR("vma is too small.\n");
                ret = -EFAULT;
                goto err_free_pages;
 
        g2d_userptr->vma = exynos_gem_get_vma(vma);
        if (!g2d_userptr->vma) {
+               up_read(¤t->mm->mmap_sem);
                DRM_ERROR("failed to copy vma.\n");
                ret = -ENOMEM;
                goto err_free_pages;
        ret = exynos_gem_get_pages_from_userptr(start & PAGE_MASK,
                                                npages, pages, vma);
        if (ret < 0) {
+               up_read(¤t->mm->mmap_sem);
                DRM_ERROR("failed to get user pages from userptr.\n");
                goto err_put_vma;
        }
 
+       up_read(¤t->mm->mmap_sem);
        g2d_userptr->pages = pages;
 
        sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);