|
@@ -616,6 +616,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
|
|
|
goto fail_buf;
|
|
|
}
|
|
|
|
|
|
+ down_read(¤t->mm->mmap_sem);
|
|
|
/* current->mm->mmap_sem is taken by videobuf2 core */
|
|
|
vma = find_vma(current->mm, vaddr);
|
|
|
if (!vma) {
|
|
@@ -642,6 +643,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
|
|
|
if (ret) {
|
|
|
unsigned long pfn;
|
|
|
if (vb2_dc_get_user_pfn(start, n_pages, vma, &pfn) == 0) {
|
|
|
+ up_read(¤t->mm->mmap_sem);
|
|
|
buf->dma_addr = vb2_dc_pfn_to_dma(buf->dev, pfn);
|
|
|
buf->size = size;
|
|
|
kfree(pages);
|
|
@@ -651,6 +653,7 @@ static void *vb2_dc_get_userptr(void *alloc_ctx, unsigned long vaddr,
|
|
|
pr_err("failed to get user pages\n");
|
|
|
goto fail_vma;
|
|
|
}
|
|
|
+ up_read(¤t->mm->mmap_sem);
|
|
|
|
|
|
sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
|
|
|
if (!sgt) {
|
|
@@ -713,10 +716,12 @@ fail_get_user_pages:
|
|
|
while (n_pages)
|
|
|
put_page(pages[--n_pages]);
|
|
|
|
|
|
+ down_read(¤t->mm->mmap_sem);
|
|
|
fail_vma:
|
|
|
vb2_put_vma(buf->vma);
|
|
|
|
|
|
fail_pages:
|
|
|
+ up_read(¤t->mm->mmap_sem);
|
|
|
kfree(pages); /* kfree is NULL-proof */
|
|
|
|
|
|
fail_buf:
|