diff options
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-core.c | 2 | ||||
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-dma-contig.c | 5 | ||||
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-dma-sg.c | 4 | ||||
-rw-r--r-- | drivers/media/v4l2-core/videobuf2-vmalloc.c | 4 |
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(¤t->mm->mmap_sem); | ||
1685 | ret = __qbuf_userptr(vb, b); | 1684 | ret = __qbuf_userptr(vb, b); |
1686 | up_read(¤t->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(¤t->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(¤t->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(¤t->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(¤t->mm->mmap_sem); | ||
716 | fail_vma: | 720 | fail_vma: |
717 | vb2_put_vma(buf->vma); | 721 | vb2_put_vma(buf->vma); |
718 | 722 | ||
719 | fail_pages: | 723 | fail_pages: |
724 | up_read(¤t->mm->mmap_sem); | ||
720 | kfree(pages); /* kfree is NULL-proof */ | 725 | kfree(pages); /* kfree is NULL-proof */ |
721 | 726 | ||
722 | fail_buf: | 727 | fail_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(¤t->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(¤t->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(¤t->mm->mmap_sem); | ||
334 | vb2_put_vma(buf->vma); | 337 | vb2_put_vma(buf->vma); |
335 | userptr_fail_find_vma: | 338 | userptr_fail_find_vma: |
339 | up_read(¤t->mm->mmap_sem); | ||
336 | kfree(buf->pages); | 340 | kfree(buf->pages); |
337 | userptr_fail_alloc_pages: | 341 | userptr_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(¤t->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(¤t->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 | ||
135 | fail_pages_array_alloc: | 136 | fail_pages_array_alloc: |
137 | up_read(¤t->mm->mmap_sem); | ||
136 | kfree(buf); | 138 | kfree(buf); |
137 | 139 | ||
138 | return NULL; | 140 | return NULL; |