Minor fix-ups to videobuf_cgmbuf locking.
e9hack, could you test this and the next patch on your hardware? Thanks.
Not fully tested, v4l1-compat doesn't work with the vivi driver!
videobuf-vmalloc.c needs fixing.
Signed-off-by: Brandon Philips <[EMAIL PROTECTED]>
---
diff --git a/linux/drivers/media/video/videobuf-core.c
b/linux/drivers/media/video/videobuf-core.c
--- a/linux/drivers/media/video/videobuf-core.c
+++ b/linux/drivers/media/video/videobuf-core.c
@@ -377,7 +377,7 @@ int videobuf_mmap_setup(struct videobuf_
return ret;
}
-int videobuf_reqbufs(struct videobuf_queue *q,
+static int __videobuf_reqbufs(struct videobuf_queue *q,
struct v4l2_requestbuffers *req)
{
unsigned int size,count;
@@ -395,22 +395,18 @@ int videobuf_reqbufs(struct videobuf_que
return -EINVAL;
}
- mutex_lock(&q->lock);
if (req->type != q->type) {
dprintk(1,"reqbufs: queue type invalid\n");
- retval = -EINVAL;
- goto done;
+ return -EINVAL;
}
if (q->streaming) {
dprintk(1,"reqbufs: streaming already exists\n");
- retval = -EBUSY;
- goto done;
+ return -EBUSY;
}
if (!list_empty(&q->stream)) {
dprintk(1,"reqbufs: stream running\n");
- retval = -EBUSY;
- goto done;
+ return -EBUSY;
}
count = req->count;
@@ -425,14 +421,22 @@ int videobuf_reqbufs(struct videobuf_que
retval = __videobuf_mmap_setup(q,count,size,req->memory);
if (retval < 0) {
dprintk(1,"reqbufs: mmap setup returned %d\n",retval);
- goto done;
+ return retval;
}
req->count = retval;
- done:
- mutex_unlock(&q->lock);
return retval;
+}
+
+int videobuf_reqbufs(struct videobuf_queue *q,
+ struct v4l2_requestbuffers *req)
+{
+ int retval;
+ mutex_lock(&q->lock);
+ retval = __videobuf_reqbufs(q, req);
+ mutex_unlock(&q->lock);
+ return retval;
}
int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b)
@@ -1032,12 +1036,15 @@ int videobuf_cgmbuf(struct videobuf_queu
MAGIC_CHECK(q->int_ops->magic,MAGIC_QTYPE_OPS);
memset(&req,0,sizeof(req));
+ mutex_lock(&q->lock);
req.type = q->type;
req.count = count;
req.memory = V4L2_MEMORY_MMAP;
- rc = videobuf_reqbufs(q,&req);
- if (rc < 0)
+ rc = __videobuf_reqbufs(q,&req);
+ if (rc < 0) {
+ mutex_unlock(&q->lock);
return rc;
+ }
mbuf->frames = req.count;
mbuf->size = 0;
@@ -1046,6 +1053,7 @@ int videobuf_cgmbuf(struct videobuf_queu
mbuf->size += q->bufs[i]->bsize;
}
+ mutex_unlock(&q->lock);
return 0;
}
EXPORT_SYMBOL_GPL(videobuf_cgmbuf);
_______________________________________________
linux-dvb mailing list
[email protected]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb