media: sta2x11: Add video_device and vb2_queue locks
Currently, this driver does not serialize its video4linux ioctls, which is a bug, as race conditions might appear. In addition, video_device and vb2_queue locks are now both mandatory. Add them, and implement wait_prepare and wait_finish. To stay on the safe side, this commit uses a single mutex for both locks. Better latency can be obtained by separating these if needed. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
d862bc08ff
commit
cd63c0288f
1 changed files with 6 additions and 0 deletions
|
@ -145,6 +145,7 @@ struct sta2x11_vip {
|
||||||
unsigned int sequence;
|
unsigned int sequence;
|
||||||
struct vip_buffer *active; /* current active buffer */
|
struct vip_buffer *active; /* current active buffer */
|
||||||
spinlock_t lock; /* Used in videobuf2 callback */
|
spinlock_t lock; /* Used in videobuf2 callback */
|
||||||
|
struct mutex v4l_lock;
|
||||||
|
|
||||||
/* Interrupt counters */
|
/* Interrupt counters */
|
||||||
int tcount, bcount;
|
int tcount, bcount;
|
||||||
|
@ -385,6 +386,8 @@ static const struct vb2_ops vip_video_qops = {
|
||||||
.buf_queue = buffer_queue,
|
.buf_queue = buffer_queue,
|
||||||
.start_streaming = start_streaming,
|
.start_streaming = start_streaming,
|
||||||
.stop_streaming = stop_streaming,
|
.stop_streaming = stop_streaming,
|
||||||
|
.wait_prepare = vb2_ops_wait_prepare,
|
||||||
|
.wait_finish = vb2_ops_wait_finish,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -870,6 +873,7 @@ static int sta2x11_vip_init_buffer(struct sta2x11_vip *vip)
|
||||||
vip->vb_vidq.mem_ops = &vb2_dma_contig_memops;
|
vip->vb_vidq.mem_ops = &vb2_dma_contig_memops;
|
||||||
vip->vb_vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
vip->vb_vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
||||||
vip->vb_vidq.dev = &vip->pdev->dev;
|
vip->vb_vidq.dev = &vip->pdev->dev;
|
||||||
|
vip->vb_vidq.lock = &vip->v4l_lock;
|
||||||
err = vb2_queue_init(&vip->vb_vidq);
|
err = vb2_queue_init(&vip->vb_vidq);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
@ -1034,6 +1038,7 @@ static int sta2x11_vip_init_one(struct pci_dev *pdev,
|
||||||
vip->std = V4L2_STD_PAL;
|
vip->std = V4L2_STD_PAL;
|
||||||
vip->format = formats_50[0];
|
vip->format = formats_50[0];
|
||||||
vip->config = config;
|
vip->config = config;
|
||||||
|
mutex_init(&vip->v4l_lock);
|
||||||
|
|
||||||
ret = sta2x11_vip_init_controls(vip);
|
ret = sta2x11_vip_init_controls(vip);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -1080,6 +1085,7 @@ static int sta2x11_vip_init_one(struct pci_dev *pdev,
|
||||||
vip->video_dev = video_dev_template;
|
vip->video_dev = video_dev_template;
|
||||||
vip->video_dev.v4l2_dev = &vip->v4l2_dev;
|
vip->video_dev.v4l2_dev = &vip->v4l2_dev;
|
||||||
vip->video_dev.queue = &vip->vb_vidq;
|
vip->video_dev.queue = &vip->vb_vidq;
|
||||||
|
vip->video_dev.lock = &vip->v4l_lock;
|
||||||
video_set_drvdata(&vip->video_dev, vip);
|
video_set_drvdata(&vip->video_dev, vip);
|
||||||
|
|
||||||
ret = video_register_device(&vip->video_dev, VFL_TYPE_GRABBER, -1);
|
ret = video_register_device(&vip->video_dev, VFL_TYPE_GRABBER, -1);
|
||||||
|
|
Loading…
Add table
Reference in a new issue