aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/v4l2-core/videobuf2-core.c2
-rw-r--r--drivers/media/v4l2-core/videobuf2-dma-contig.c5
-rw-r--r--drivers/media/v4l2-core/videobuf2-dma-sg.c4
-rw-r--r--drivers/media/v4l2-core/videobuf2-vmalloc.c4
4 files changed, 12 insertions, 3 deletions
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index b866a6becd99..243b28d07373 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -1681,9 +1681,7 @@ static int __buf_prepare(struct vb2_buffer *vb, const struct v4l2_buffer *b)
1681 ret = __qbuf_mmap(vb, b); 1681 ret = __qbuf_mmap(vb, b);
1682 break; 1682 break;
1683 case V4L2_MEMORY_USERPTR: 1683 case V4L2_MEMORY_USERPTR:
1684 down_read(&current->mm->mmap_sem);
1685 ret = __qbuf_userptr(vb, b); 1684 ret = __qbuf_userptr(vb, b);
1686 up_read(&current->mm->mmap_sem);
1687 break; 1685 break;
1688 case V4L2_MEMORY_DMABUF: 1686 case V4L2_MEMORY_DMABUF:
1689 ret = __qbuf_dmabuf(vb, b); 1687 ret = __qbuf_dmabuf(vb, b);
diff --git a/drivers/media/v4l2-core/videobuf2-dma-contig.c b/drivers/media/v4l2-core/videobuf2-dma-contig.c
index 94c1e6455d36..c548ce425701 100644
--- a/drivers/media/v4l2-core/videobuf2-dma-contig.c
+++ b/drivers/media/v4l2-core/videobuf2-dma-contig.c
@@ -616,6 +616,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
616 goto fail_buf; 616 goto fail_buf;
617 } 617 }
618 618
619 down_read(&current->mm->mmap_sem);
619 /* current->mm->mmap_sem is taken by videobuf2 core */ 620 /* current->mm->mmap_sem is taken by videobuf2 core */
620 vma = find_vma(current->mm, vaddr); 621 vma = find_vma(current->mm, vaddr);
621 if (!vma) { 622 if (!vma) {
@@ -642,6 +643,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
642 if (ret) { 643 if (ret) {
643 unsigned long pfn; 644 unsigned long pfn;
644 if (vb2_dc_get_user_pfn(start, n_pages, vma, &pfn) == 0) { 645 if (vb2_dc_get_user_pfn(start, n_pages, vma, &pfn) == 0) {
646 up_read(&current->mm->mmap_sem);
645 buf->dma_addr = vb2_dc_pfn_to_dma(buf->dev, pfn); 647 buf->dma_addr = vb2_dc_pfn_to_dma(buf->dev, pfn);
646 buf->size = size; 648 buf->size = size;
647 kfree(pages); 649 kfree(pages);
@@ -651,6 +653,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
651 pr_err("failed to get user pages\n"); 653 pr_err("failed to get user pages\n");
652 goto fail_vma; 654 goto fail_vma;
653 } 655 }
656 up_read(&current->mm->mmap_sem);
654 657
655 sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); 658 sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
656 if (!sgt) { 659 if (!sgt) {
@@ -713,10 +716,12 @@ fail_get_user_pages:
713 while (n_pages) 716 while (n_pages)
714 put_page(pages[--n_pages]); 717 put_page(pages[--n_pages]);
715 718
719 down_read(&current->mm->mmap_sem);
716fail_vma: 720fail_vma:
717 vb2_put_vma(buf->vma); 721 vb2_put_vma(buf->vma);
718 722
719fail_pages: 723fail_pages:
724 up_read(&current->mm->mmap_sem);
720 kfree(pages); /* kfree is NULL-proof */ 725 kfree(pages); /* kfree is NULL-proof */
721 726
722fail_buf: 727fail_buf:
diff --git a/drivers/media/v4l2-core/videobuf2-dma-sg.c b/drivers/media/v4l2-core/videobuf2-dma-sg.c
index 7289b81bd7b7..d2cf113d1933 100644
--- a/drivers/media/v4l2-core/videobuf2-dma-sg.c
+++ b/drivers/media/v4l2-core/videobuf2-dma-sg.c
@@ -264,6 +264,7 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr,
264 if (!buf->pages) 264 if (!buf->pages)
265 goto userptr_fail_alloc_pages; 265 goto userptr_fail_alloc_pages;
266 266
267 down_read(&current->mm->mmap_sem);
267 vma = find_vma(current->mm, vaddr); 268 vma = find_vma(current->mm, vaddr);
268 if (!vma) { 269 if (!vma) {
269 dprintk(1, "no vma for address %lu\n", vaddr); 270 dprintk(1, "no vma for address %lu\n", vaddr);
@@ -302,6 +303,7 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr,
302 1, /* force */ 303 1, /* force */
303 buf->pages, 304 buf->pages,
304 NULL); 305 NULL);
306 up_read(&current->mm->mmap_sem);
305 307
306 if (num_pages_from_user != buf->num_pages) 308 if (num_pages_from_user != buf->num_pages)
307 goto userptr_fail_get_user_pages; 309 goto userptr_fail_get_user_pages;
@@ -331,8 +333,10 @@ userptr_fail_get_user_pages:
331 if (!vma_is_io(buf->vma)) 333 if (!vma_is_io(buf->vma))
332 while (--num_pages_from_user >= 0) 334 while (--num_pages_from_user >= 0)
333 put_page(buf->pages[num_pages_from_user]); 335 put_page(buf->pages[num_pages_from_user]);
336 down_read(&current->mm->mmap_sem);
334 vb2_put_vma(buf->vma); 337 vb2_put_vma(buf->vma);
335userptr_fail_find_vma: 338userptr_fail_find_vma:
339 up_read(&current->mm->mmap_sem);
336 kfree(buf->pages); 340 kfree(buf->pages);
337userptr_fail_alloc_pages: 341userptr_fail_alloc_pages:
338 kfree(buf); 342 kfree(buf);
diff --git a/drivers/media/v4l2-core/videobuf2-vmalloc.c b/drivers/media/v4l2-core/videobuf2-vmalloc.c
index 2fe4c27f524a..63bef959623e 100644
--- a/drivers/media/v4l2-core/videobuf2-vmalloc.c
+++ b/drivers/media/v4l2-core/videobuf2-vmalloc.c
@@ -89,7 +89,7 @@ static void *vb2_vmalloc_get_userptr(void *alloc_ctx, unsigned long vaddr,
89 offset = vaddr & ~PAGE_MASK; 89 offset = vaddr & ~PAGE_MASK;
90 buf->size = size; 90 buf->size = size;
91 91
92 92 down_read(&current->mm->mmap_sem);
93 vma = find_vma(current->mm, vaddr); 93 vma = find_vma(current->mm, vaddr);
94 if (vma && (vma->vm_flags & VM_PFNMAP) && (vma->vm_pgoff)) { 94 if (vma && (vma->vm_flags & VM_PFNMAP) && (vma->vm_pgoff)) {
95 if (vb2_get_contig_userptr(vaddr, size, &vma, &physp)) 95 if (vb2_get_contig_userptr(vaddr, size, &vma, &physp))
@@ -121,6 +121,7 @@ static void *vb2_vmalloc_get_userptr(void *alloc_ctx, unsigned long vaddr,
121 if (!buf->vaddr) 121 if (!buf->vaddr)
122 goto fail_get_user_pages; 122 goto fail_get_user_pages;
123 } 123 }
124 up_read(&current->mm->mmap_sem);
124 125
125 buf->vaddr += offset; 126 buf->vaddr += offset;
126 return buf; 127 return buf;
@@ -133,6 +134,7 @@ fail_get_user_pages:
133 kfree(buf->pages); 134 kfree(buf->pages);
134 135
135fail_pages_array_alloc: 136fail_pages_array_alloc:
137 up_read(&current->mm->mmap_sem);
136 kfree(buf); 138 kfree(buf);
137 139
138 return NULL; 140 return NULL;