Skip to content

Commit

Permalink
V4L/DVB (7561): videobuf-vmalloc: stop streaming before unmap
Browse files Browse the repository at this point in the history
Before the patch, there were a risk of freeing and unmapping userspace memory,
while there were pending requests.

Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Mauro Carvalho Chehab committed Apr 24, 2008
1 parent d684965 commit aa9479e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
1 change: 0 additions & 1 deletion drivers/media/video/videobuf-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -901,7 +901,6 @@ static void __videobuf_read_stop(struct videobuf_queue *q)
{
int i;


videobuf_queue_cancel(q);
__videobuf_mmap_free(q);
INIT_LIST_HEAD(&q->stream);
Expand Down
23 changes: 19 additions & 4 deletions drivers/media/video/videobuf-vmalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ static void videobuf_vm_close(struct vm_area_struct *vma)

dprintk(1, "munmap %p q=%p\n", map, q);
mutex_lock(&q->vb_lock);

/* We need first to cancel streams, before unmapping */
if (q->streaming)
videobuf_queue_cancel(q);

for (i = 0; i < VIDEO_MAX_FRAME; i++) {
if (NULL == q->bufs[i])
continue;
Expand All @@ -86,17 +91,28 @@ static void videobuf_vm_close(struct vm_area_struct *vma)
In this case, memory should be freed,
in order to do memory unmap.
*/

MAGIC_CHECK(mem->magic, MAGIC_VMAL_MEM);

/* vfree is not atomic - can't be
called with IRQ's disabled
*/
dprintk(1, "%s: buf[%d] freeing (%p)\n",
__func__, i, mem->vmalloc);

vfree(mem->vmalloc);
mem->vmalloc = NULL;
}

q->bufs[i]->map = NULL;
q->bufs[i]->baddr = 0;
}
mutex_unlock(&q->vb_lock);

kfree(map);

mutex_unlock(&q->vb_lock);
}

return;
}

Expand Down Expand Up @@ -138,6 +154,7 @@ static int __videobuf_iolock (struct videobuf_queue* q,
struct v4l2_framebuffer *fbuf)
{
struct videobuf_vmalloc_memory *mem = vb->priv;
int pages;

BUG_ON(!mem);

Expand All @@ -154,8 +171,7 @@ static int __videobuf_iolock (struct videobuf_queue* q,
}
break;
case V4L2_MEMORY_USERPTR:
{
int pages = PAGE_ALIGN(vb->size);
pages = PAGE_ALIGN(vb->size);

dprintk(1, "%s memory method USERPTR\n", __func__);

Expand Down Expand Up @@ -198,7 +214,6 @@ static int __videobuf_iolock (struct videobuf_queue* q,
#endif

break;
}
case V4L2_MEMORY_OVERLAY:
default:
dprintk(1, "%s memory method OVERLAY/unknown\n", __func__);
Expand Down

0 comments on commit aa9479e

Please sign in to comment.