Commit cd63c028 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Mauro Carvalho Chehab

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: default avatarEzequiel Garcia <ezequiel@collabora.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent d862bc08
...@@ -145,6 +145,7 @@ struct sta2x11_vip { ...@@ -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 = { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment