* [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler
@ 2018-06-15 19:07 Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 01/17] v4l2-ioctl.c: use correct vb2_queue lock for m2m devices Ezequiel Garcia
` (17 more replies)
0 siblings, 18 replies; 28+ messages in thread
From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw)
To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia
Fourth spin of the series posted by Hans:
https://www.mail-archive.com/linux-media@vger.kernel.org/msg131363.html
There aren't any changes from v3, aside from rebasing
and re-ordering the patches as requested by Hans.
See v3 cover letter for more details.
Series was tested with tw686x, gspca sonixj and UVC devices.
Build tested with the 0-day kbuild test robot.
Changelog
---------
v4:
Rebased on top of today's next.
v3:
Reduce changes in patches 6 and 7 for omap3isp and omap4iss
drivers, as suggested by Hans.
v2:
Add the required driver modifications, fixing all
drivers so they define a proper vb2_queue lock.
Ezequiel Garcia (13):
sta2x11: Add video_device and vb2_queue locks
omap4iss: Add vb2_queue lock
omap3isp: Add vb2_queue lock
mtk-mdp: Add locks for capture and output vb2_queues
s5p-g2d: Implement wait_prepare and wait_finish
staging: bcm2835-camera: Provide lock for vb2_queue
venus: Add video_device and vb2_queue locks
davinci_vpfe: Add video_device and vb2_queue locks
mx_emmaprp: Implement wait_prepare and wait_finish
m2m-deinterlace: Implement wait_prepare and wait_finish
stk1160: Set the vb2_queue lock before calling vb2_queue_init
dvb-core: Provide lock for vb2_queue
media: Remove wait_{prepare, finish}
Hans Verkuil (4):
v4l2-ioctl.c: use correct vb2_queue lock for m2m devices
videobuf2-core: require q->lock
videobuf2: assume q->lock is always set
v4l2-ioctl.c: assume queue->lock is always set
Documentation/media/kapi/v4l2-dev.rst | 7 +--
drivers/input/rmi4/rmi_f54.c | 2 -
drivers/input/touchscreen/atmel_mxt_ts.c | 2 -
drivers/input/touchscreen/sur40.c | 2 -
.../media/common/videobuf2/videobuf2-core.c | 22 +++----
.../media/common/videobuf2/videobuf2-v4l2.c | 41 +++---------
drivers/media/dvb-core/dvb_vb2.c | 20 +-----
drivers/media/dvb-frontends/rtl2832_sdr.c | 2 -
drivers/media/i2c/video-i2c.c | 2 -
drivers/media/pci/cobalt/cobalt-v4l2.c | 2 -
drivers/media/pci/cx23885/cx23885-417.c | 2 -
drivers/media/pci/cx23885/cx23885-dvb.c | 2 -
drivers/media/pci/cx23885/cx23885-vbi.c | 2 -
drivers/media/pci/cx23885/cx23885-video.c | 2 -
drivers/media/pci/cx25821/cx25821-video.c | 2 -
drivers/media/pci/cx88/cx88-blackbird.c | 2 -
drivers/media/pci/cx88/cx88-dvb.c | 2 -
drivers/media/pci/cx88/cx88-vbi.c | 2 -
drivers/media/pci/cx88/cx88-video.c | 2 -
drivers/media/pci/dt3155/dt3155.c | 2 -
drivers/media/pci/intel/ipu3/ipu3-cio2.c | 2 -
drivers/media/pci/saa7134/saa7134-empress.c | 2 -
drivers/media/pci/saa7134/saa7134-ts.c | 2 -
drivers/media/pci/saa7134/saa7134-vbi.c | 2 -
drivers/media/pci/saa7134/saa7134-video.c | 2 -
.../media/pci/solo6x10/solo6x10-v4l2-enc.c | 2 -
drivers/media/pci/solo6x10/solo6x10-v4l2.c | 2 -
drivers/media/pci/sta2x11/sta2x11_vip.c | 4 ++
drivers/media/pci/tw5864/tw5864-video.c | 2 -
drivers/media/pci/tw68/tw68-video.c | 2 -
drivers/media/pci/tw686x/tw686x-video.c | 2 -
drivers/media/platform/am437x/am437x-vpfe.c | 2 -
drivers/media/platform/atmel/atmel-isc.c | 2 -
drivers/media/platform/atmel/atmel-isi.c | 2 -
drivers/media/platform/coda/coda-common.c | 2 -
drivers/media/platform/davinci/vpbe_display.c | 2 -
drivers/media/platform/davinci/vpif_capture.c | 2 -
drivers/media/platform/davinci/vpif_display.c | 2 -
drivers/media/platform/exynos-gsc/gsc-m2m.c | 2 -
.../media/platform/exynos4-is/fimc-capture.c | 2 -
.../platform/exynos4-is/fimc-isp-video.c | 2 -
drivers/media/platform/exynos4-is/fimc-lite.c | 2 -
drivers/media/platform/exynos4-is/fimc-m2m.c | 2 -
drivers/media/platform/m2m-deinterlace.c | 2 +
.../media/platform/marvell-ccic/mcam-core.c | 4 --
.../media/platform/mtk-jpeg/mtk_jpeg_core.c | 2 -
drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 18 +-----
.../platform/mtk-vcodec/mtk_vcodec_dec.c | 2 -
.../platform/mtk-vcodec/mtk_vcodec_enc.c | 2 -
drivers/media/platform/mx2_emmaprp.c | 2 +
drivers/media/platform/omap3isp/ispvideo.c | 63 +++----------------
drivers/media/platform/omap3isp/ispvideo.h | 1 -
drivers/media/platform/pxa_camera.c | 2 -
.../platform/qcom/camss-8x16/camss-video.c | 2 -
drivers/media/platform/qcom/venus/core.h | 4 +-
drivers/media/platform/qcom/venus/helpers.c | 16 ++---
drivers/media/platform/qcom/venus/vdec.c | 23 +++----
drivers/media/platform/qcom/venus/venc.c | 17 +++--
drivers/media/platform/rcar-vin/rcar-dma.c | 2 -
drivers/media/platform/rcar_drif.c | 2 -
drivers/media/platform/rcar_fdp1.c | 2 -
drivers/media/platform/rcar_jpu.c | 2 -
drivers/media/platform/renesas-ceu.c | 2 -
drivers/media/platform/rockchip/rga/rga-buf.c | 2 -
.../media/platform/s3c-camif/camif-capture.c | 2 -
drivers/media/platform/s5p-jpeg/jpeg-core.c | 2 -
drivers/media/platform/s5p-mfc/s5p_mfc_dec.c | 2 -
drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | 2 -
drivers/media/platform/sh_veu.c | 2 -
drivers/media/platform/sh_vou.c | 2 -
.../soc_camera/sh_mobile_ceu_camera.c | 2 -
drivers/media/platform/sti/bdisp/bdisp-v4l2.c | 2 -
drivers/media/platform/sti/delta/delta-v4l2.c | 4 --
drivers/media/platform/sti/hva/hva-v4l2.c | 2 -
drivers/media/platform/stm32/stm32-dcmi.c | 2 -
drivers/media/platform/ti-vpe/cal.c | 2 -
drivers/media/platform/ti-vpe/vpe.c | 2 -
drivers/media/platform/vim2m.c | 2 -
drivers/media/platform/vimc/vimc-capture.c | 6 --
drivers/media/platform/vivid/vivid-sdr-cap.c | 2 -
drivers/media/platform/vivid/vivid-vbi-cap.c | 2 -
drivers/media/platform/vivid/vivid-vbi-out.c | 2 -
drivers/media/platform/vivid/vivid-vid-cap.c | 2 -
drivers/media/platform/vivid/vivid-vid-out.c | 2 -
drivers/media/platform/vsp1/vsp1_histo.c | 2 -
drivers/media/platform/vsp1/vsp1_video.c | 2 -
drivers/media/platform/xilinx/xilinx-dma.c | 2 -
drivers/media/usb/airspy/airspy.c | 2 -
drivers/media/usb/au0828/au0828-vbi.c | 2 -
drivers/media/usb/au0828/au0828-video.c | 2 -
drivers/media/usb/em28xx/em28xx-vbi.c | 2 -
drivers/media/usb/em28xx/em28xx-video.c | 2 -
drivers/media/usb/go7007/go7007-v4l2.c | 2 -
drivers/media/usb/gspca/gspca.c | 2 -
drivers/media/usb/hackrf/hackrf.c | 2 -
drivers/media/usb/msi2500/msi2500.c | 2 -
drivers/media/usb/pwc/pwc-if.c | 2 -
drivers/media/usb/s2255/s2255drv.c | 2 -
drivers/media/usb/stk1160/stk1160-v4l.c | 4 +-
drivers/media/usb/usbtv/usbtv-video.c | 2 -
drivers/media/usb/uvc/uvc_queue.c | 4 --
drivers/media/v4l2-core/v4l2-ioctl.c | 62 ++++++++++++++++--
.../staging/media/davinci_vpfe/vpfe_video.c | 4 +-
.../staging/media/davinci_vpfe/vpfe_video.h | 2 +-
drivers/staging/media/imx/imx-media-capture.c | 2 -
drivers/staging/media/omap4iss/iss_video.c | 13 +---
.../bcm2835-camera/bcm2835-camera.c | 22 +------
drivers/usb/gadget/function/uvc_queue.c | 2 -
include/media/videobuf2-core.h | 2 -
include/media/videobuf2-v4l2.h | 18 ------
samples/v4l/v4l2-pci-skeleton.c | 7 ---
111 files changed, 131 insertions(+), 429 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 28+ messages in thread* [PATCH v4 01/17] v4l2-ioctl.c: use correct vb2_queue lock for m2m devices 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 02/17] sta2x11: Add video_device and vb2_queue locks Ezequiel Garcia ` (16 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Hans Verkuil From: Hans Verkuil <hansverk@cisco.com> For m2m devices the vdev->queue lock was always taken instead of the lock for the specific capture or output queue. Now that we pushed the locking down into __video_do_ioctl() we can pick the correct lock and improve the performance of m2m devices. Signed-off-by: Hans Verkuil <hansverk@cisco.com> --- drivers/media/v4l2-core/v4l2-ioctl.c | 59 ++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index dd210067151f..db835578e21f 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -29,6 +29,7 @@ #include <media/v4l2-device.h> #include <media/videobuf2-v4l2.h> #include <media/v4l2-mc.h> +#include <media/v4l2-mem2mem.h> #include <trace/events/v4l2.h> @@ -2662,11 +2663,62 @@ static bool v4l2_is_known_ioctl(unsigned int cmd) return v4l2_ioctls[_IOC_NR(cmd)].ioctl == cmd; } +#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV) +static bool v4l2_ioctl_m2m_queue_is_output(unsigned int cmd, void *arg) +{ + switch (cmd) { + case VIDIOC_CREATE_BUFS: { + struct v4l2_create_buffers *cbufs = arg; + + return V4L2_TYPE_IS_OUTPUT(cbufs->format.type); + } + case VIDIOC_REQBUFS: { + struct v4l2_requestbuffers *rbufs = arg; + + return V4L2_TYPE_IS_OUTPUT(rbufs->type); + } + case VIDIOC_QBUF: + case VIDIOC_DQBUF: + case VIDIOC_QUERYBUF: + case VIDIOC_PREPARE_BUF: { + struct v4l2_buffer *buf = arg; + + return V4L2_TYPE_IS_OUTPUT(buf->type); + } + case VIDIOC_EXPBUF: { + struct v4l2_exportbuffer *expbuf = arg; + + return V4L2_TYPE_IS_OUTPUT(expbuf->type); + } + case VIDIOC_STREAMON: + case VIDIOC_STREAMOFF: { + int *type = arg; + + return V4L2_TYPE_IS_OUTPUT(*type); + } + default: + return false; + } +} +#endif + static struct mutex *v4l2_ioctl_get_lock(struct video_device *vdev, - unsigned int cmd) + struct v4l2_fh *vfh, unsigned cmd, + void *arg) { if (_IOC_NR(cmd) >= V4L2_IOCTLS) return vdev->lock; +#if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV) + if (vfh && vfh->m2m_ctx && + (v4l2_ioctls[_IOC_NR(cmd)].flags & INFO_FL_QUEUE)) { + bool is_output = v4l2_ioctl_m2m_queue_is_output(cmd, arg); + struct v4l2_m2m_queue_ctx *ctx = is_output ? + &vfh->m2m_ctx->out_q_ctx : &vfh->m2m_ctx->cap_q_ctx; + + if (ctx->q.lock) + return ctx->q.lock; + } +#endif if (vdev->queue && vdev->queue->lock && (v4l2_ioctls[_IOC_NR(cmd)].flags & INFO_FL_QUEUE)) return vdev->queue->lock; @@ -2714,7 +2766,7 @@ static long __video_do_ioctl(struct file *file, unsigned int cmd, void *arg) { struct video_device *vfd = video_devdata(file); - struct mutex *lock; /* ioctl serialization mutex */ + struct mutex *lock; const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops; bool write_only = false; struct v4l2_ioctl_info default_info; @@ -2733,8 +2785,7 @@ static long __video_do_ioctl(struct file *file, if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) vfh = file->private_data; - lock = v4l2_ioctl_get_lock(vfd, cmd); - + lock = v4l2_ioctl_get_lock(vfd, vfh, cmd, arg); if (lock && mutex_lock_interruptible(lock)) return -ERESTARTSYS; -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 02/17] sta2x11: Add video_device and vb2_queue locks 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 01/17] v4l2-ioctl.c: use correct vb2_queue lock for m2m devices Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 03/17] omap4iss: Add vb2_queue lock Ezequiel Garcia ` (15 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia 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> --- drivers/media/pci/sta2x11/sta2x11_vip.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/media/pci/sta2x11/sta2x11_vip.c b/drivers/media/pci/sta2x11/sta2x11_vip.c index 069c4a853346..da2b2a2292d0 100644 --- a/drivers/media/pci/sta2x11/sta2x11_vip.c +++ b/drivers/media/pci/sta2x11/sta2x11_vip.c @@ -145,6 +145,7 @@ struct sta2x11_vip { unsigned int sequence; struct vip_buffer *active; /* current active buffer */ spinlock_t lock; /* Used in videobuf2 callback */ + struct mutex v4l_lock; /* Interrupt counters */ int tcount, bcount; @@ -385,6 +386,8 @@ static const struct vb2_ops vip_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_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.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; vip->vb_vidq.dev = &vip->pdev->dev; + vip->vb_vidq.lock = &vip->v4l_lock; err = vb2_queue_init(&vip->vb_vidq); if (err) return err; @@ -1034,6 +1038,7 @@ static int sta2x11_vip_init_one(struct pci_dev *pdev, vip->std = V4L2_STD_PAL; vip->format = formats_50[0]; vip->config = config; + mutex_init(&vip->v4l_lock); ret = sta2x11_vip_init_controls(vip); 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.v4l2_dev = &vip->v4l2_dev; vip->video_dev.queue = &vip->vb_vidq; + vip->video_dev.lock = &vip->v4l_lock; video_set_drvdata(&vip->video_dev, vip); ret = video_register_device(&vip->video_dev, VFL_TYPE_GRABBER, -1); -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 03/17] omap4iss: Add vb2_queue lock 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 01/17] v4l2-ioctl.c: use correct vb2_queue lock for m2m devices Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 02/17] sta2x11: Add video_device and vb2_queue locks Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-07-02 8:28 ` Hans Verkuil 2018-06-15 19:07 ` [PATCH v4 04/17] omap3isp: " Ezequiel Garcia ` (14 subsequent siblings) 17 siblings, 1 reply; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia vb2_queue lock is now mandatory. Add it, remove driver ad-hoc locks, and implement wait_{prepare, finish}. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/staging/media/omap4iss/iss_video.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c index a3a83424a926..d919bae83828 100644 --- a/drivers/staging/media/omap4iss/iss_video.c +++ b/drivers/staging/media/omap4iss/iss_video.c @@ -873,8 +873,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* * Start streaming on the pipeline. No link touching an entity in the * pipeline can be activated or deactivated once streaming is started. @@ -978,8 +976,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) media_graph_walk_cleanup(&graph); - mutex_unlock(&video->stream_lock); - return 0; err_omap4iss_set_stream: @@ -996,8 +992,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) err_graph_walk_init: media_entity_enum_cleanup(&pipe->ent_enum); - mutex_unlock(&video->stream_lock); - return ret; } @@ -1013,10 +1007,8 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - if (!vb2_is_streaming(&vfh->queue)) - goto done; + return 0; /* Update the pipeline state. */ if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) @@ -1041,8 +1033,6 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) video->iss->pdata->set_constraints(video->iss, false); media_pipeline_stop(&video->video.entity); -done: - mutex_unlock(&video->stream_lock); return 0; } @@ -1137,6 +1127,7 @@ static int iss_video_open(struct file *file) q->buf_struct_size = sizeof(struct iss_buffer); q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; q->dev = video->iss->dev; + q->lock = &video->stream_lock; ret = vb2_queue_init(q); if (ret) { -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v4 03/17] omap4iss: Add vb2_queue lock 2018-06-15 19:07 ` [PATCH v4 03/17] omap4iss: Add vb2_queue lock Ezequiel Garcia @ 2018-07-02 8:28 ` Hans Verkuil 2018-07-06 15:24 ` Ezequiel Garcia 0 siblings, 1 reply; 28+ messages in thread From: Hans Verkuil @ 2018-07-02 8:28 UTC (permalink / raw) To: Ezequiel Garcia, linux-media; +Cc: Hans Verkuil, kernel On 15/06/18 21:07, Ezequiel Garcia wrote: > vb2_queue lock is now mandatory. Add it, remove driver ad-hoc > locks, and implement wait_{prepare, finish}. I don't see any wait_prepare/finish implementation?! Regards, Hans > > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > --- > drivers/staging/media/omap4iss/iss_video.c | 13 ++----------- > 1 file changed, 2 insertions(+), 11 deletions(-) > > diff --git a/drivers/staging/media/omap4iss/iss_video.c b/drivers/staging/media/omap4iss/iss_video.c > index a3a83424a926..d919bae83828 100644 > --- a/drivers/staging/media/omap4iss/iss_video.c > +++ b/drivers/staging/media/omap4iss/iss_video.c > @@ -873,8 +873,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* > * Start streaming on the pipeline. No link touching an entity in the > * pipeline can be activated or deactivated once streaming is started. > @@ -978,8 +976,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > media_graph_walk_cleanup(&graph); > > - mutex_unlock(&video->stream_lock); > - > return 0; > > err_omap4iss_set_stream: > @@ -996,8 +992,6 @@ iss_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > err_graph_walk_init: > media_entity_enum_cleanup(&pipe->ent_enum); > > - mutex_unlock(&video->stream_lock); > - > return ret; > } > > @@ -1013,10 +1007,8 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > if (!vb2_is_streaming(&vfh->queue)) > - goto done; > + return 0; > > /* Update the pipeline state. */ > if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > @@ -1041,8 +1033,6 @@ iss_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > video->iss->pdata->set_constraints(video->iss, false); > media_pipeline_stop(&video->video.entity); > > -done: > - mutex_unlock(&video->stream_lock); > return 0; > } > > @@ -1137,6 +1127,7 @@ static int iss_video_open(struct file *file) > q->buf_struct_size = sizeof(struct iss_buffer); > q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > q->dev = video->iss->dev; > + q->lock = &video->stream_lock; > > ret = vb2_queue_init(q); > if (ret) { > ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v4 03/17] omap4iss: Add vb2_queue lock 2018-07-02 8:28 ` Hans Verkuil @ 2018-07-06 15:24 ` Ezequiel Garcia 0 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-07-06 15:24 UTC (permalink / raw) To: Hans Verkuil, linux-media, Laurent Pinchart, sakari.ailus Cc: Hans Verkuil, kernel On Mon, 2018-07-02 at 10:28 +0200, Hans Verkuil wrote: > On 15/06/18 21:07, Ezequiel Garcia wrote: > > vb2_queue lock is now mandatory. Add it, remove driver ad-hoc > > locks, and implement wait_{prepare, finish}. > > I don't see any wait_prepare/finish implementation?! > > Oops, seems it felt through the cracks. Anyway, we need to solve the omap3 issues before going forward with this series. Thanks, Eze ^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v4 04/17] omap3isp: Add vb2_queue lock 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (2 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 03/17] omap4iss: Add vb2_queue lock Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-18 7:31 ` Hans Verkuil 2018-06-15 19:07 ` [PATCH v4 05/17] mtk-mdp: Add locks for capture and output vb2_queues Ezequiel Garcia ` (13 subsequent siblings) 17 siblings, 1 reply; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, and implement wait_{prepare, finish}. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ drivers/media/platform/omap3isp/ispvideo.h | 1 - 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index 9d228eac24ea..f835aeb9ddc5 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { .buf_prepare = isp_video_buffer_prepare, .buf_queue = isp_video_buffer_queue, .start_streaming = isp_video_start_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; /* @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int continuous) { struct isp_buffer *buf = NULL; - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { - mutex_lock(&video->queue_lock); + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) vb2_discard_done(video->queue); - mutex_unlock(&video->queue_lock); - } if (!list_empty(&video->dmaqueue)) { buf = list_first_entry(&video->dmaqueue, @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - - mutex_lock(&video->queue_lock); - ret = vb2_reqbufs(&vfh->queue, rb); - mutex_unlock(&video->queue_lock); - return ret; + return vb2_reqbufs(&vfh->queue, rb); } static int @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_querybuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_querybuf(&vfh->queue, b); } static int @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_qbuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_qbuf(&vfh->queue, b); } static int @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); } static int isp_video_check_external_subdevs(struct isp_video *video, @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Start streaming on the pipeline. No link touching an entity in the * pipeline can be activated or deactivated once streaming is started. */ @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); if (ret) - goto err_enum_init; + return ret; /* TODO: Implement PM QoS */ pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) atomic_set(&pipe->frame_number, -1); pipe->field = vfh->format.fmt.pix.field; - mutex_lock(&video->queue_lock); ret = vb2_streamon(&vfh->queue, type); - mutex_unlock(&video->queue_lock); if (ret < 0) goto err_check_format; - mutex_unlock(&video->stream_lock); - return 0; err_check_format: @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) media_entity_enum_cleanup(&pipe->ent_enum); -err_enum_init: - mutex_unlock(&video->stream_lock); - return ret; } @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Make sure we're not streaming yet. */ - mutex_lock(&video->queue_lock); streaming = vb2_is_streaming(&vfh->queue); - mutex_unlock(&video->queue_lock); - if (!streaming) - goto done; + return 0; /* Update the pipeline state. */ if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); omap3isp_video_cancel_stream(video); - mutex_lock(&video->queue_lock); vb2_streamoff(&vfh->queue, type); - mutex_unlock(&video->queue_lock); video->queue = NULL; video->error = false; /* TODO: Implement PM QoS */ media_pipeline_stop(&video->video.entity); - media_entity_enum_cleanup(&pipe->ent_enum); - -done: - mutex_unlock(&video->stream_lock); return 0; } @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) queue->buf_struct_size = sizeof(struct isp_buffer); queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; queue->dev = video->isp->dev; + queue->lock = &video->queue_lock; ret = vb2_queue_init(&handle->queue); if (ret < 0) { @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) struct v4l2_fh *vfh = file->private_data; struct isp_video_fh *handle = to_isp_video_fh(vfh); + mutex_lock(&video->queue_lock); /* Disable streaming and free the buffers queue resources. */ isp_video_streamoff(file, vfh, video->type); - - mutex_lock(&video->queue_lock); vb2_queue_release(&handle->queue); mutex_unlock(&video->queue_lock); @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const char *name) atomic_set(&video->active, 0); spin_lock_init(&video->pipe.lock); - mutex_init(&video->stream_lock); mutex_init(&video->queue_lock); spin_lock_init(&video->irqlock); @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) { media_entity_cleanup(&video->video.entity); mutex_destroy(&video->queue_lock); - mutex_destroy(&video->stream_lock); mutex_destroy(&video->mutex); } diff --git a/drivers/media/platform/omap3isp/ispvideo.h b/drivers/media/platform/omap3isp/ispvideo.h index f6a2082b4a0a..5a8fba85e0eb 100644 --- a/drivers/media/platform/omap3isp/ispvideo.h +++ b/drivers/media/platform/omap3isp/ispvideo.h @@ -167,7 +167,6 @@ struct isp_video { /* Pipeline state */ struct isp_pipeline pipe; - struct mutex stream_lock; /* pipeline and stream states */ bool error; /* Video buffers queue */ -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v4 04/17] omap3isp: Add vb2_queue lock 2018-06-15 19:07 ` [PATCH v4 04/17] omap3isp: " Ezequiel Garcia @ 2018-06-18 7:31 ` Hans Verkuil 2018-06-20 17:42 ` [PATCH v5 " Ezequiel Garcia 0 siblings, 1 reply; 28+ messages in thread From: Hans Verkuil @ 2018-06-18 7:31 UTC (permalink / raw) To: Ezequiel Garcia, linux-media; +Cc: Hans Verkuil, kernel On 06/15/2018 09:07 PM, Ezequiel Garcia wrote: > vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, > and implement wait_{prepare, finish}. You are also removing stream_lock, but that is not mentioned here. This needs an improved commit log. Regards, Hans > > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > --- > drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ > drivers/media/platform/omap3isp/ispvideo.h | 1 - > 2 files changed, 11 insertions(+), 55 deletions(-) > > diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c > index 9d228eac24ea..f835aeb9ddc5 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.c > +++ b/drivers/media/platform/omap3isp/ispvideo.c > @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { > .buf_prepare = isp_video_buffer_prepare, > .buf_queue = isp_video_buffer_queue, > .start_streaming = isp_video_start_streaming, > + .wait_prepare = vb2_ops_wait_prepare, > + .wait_finish = vb2_ops_wait_finish, > }; > > /* > @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int continuous) > { > struct isp_buffer *buf = NULL; > > - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { > - mutex_lock(&video->queue_lock); > + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > vb2_discard_done(video->queue); > - mutex_unlock(&video->queue_lock); > - } > > if (!list_empty(&video->dmaqueue)) { > buf = list_first_entry(&video->dmaqueue, > @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > - > - mutex_lock(&video->queue_lock); > - ret = vb2_reqbufs(&vfh->queue, rb); > - mutex_unlock(&video->queue_lock); > > - return ret; > + return vb2_reqbufs(&vfh->queue, rb); > } > > static int > @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_querybuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_querybuf(&vfh->queue, b); > } > > static int > @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_qbuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_qbuf(&vfh->queue, b); > } > > static int > @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > } > > static int isp_video_check_external_subdevs(struct isp_video *video, > @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Start streaming on the pipeline. No link touching an entity in the > * pipeline can be activated or deactivated once streaming is started. > */ > @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); > if (ret) > - goto err_enum_init; > + return ret; > > /* TODO: Implement PM QoS */ > pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); > @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > atomic_set(&pipe->frame_number, -1); > pipe->field = vfh->format.fmt.pix.field; > > - mutex_lock(&video->queue_lock); > ret = vb2_streamon(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > if (ret < 0) > goto err_check_format; > > - mutex_unlock(&video->stream_lock); > - > return 0; > > err_check_format: > @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > media_entity_enum_cleanup(&pipe->ent_enum); > > -err_enum_init: > - mutex_unlock(&video->stream_lock); > - > return ret; > } > > @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Make sure we're not streaming yet. */ > - mutex_lock(&video->queue_lock); > streaming = vb2_is_streaming(&vfh->queue); > - mutex_unlock(&video->queue_lock); > - > if (!streaming) > - goto done; > + return 0; > > /* Update the pipeline state. */ > if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); > omap3isp_video_cancel_stream(video); > > - mutex_lock(&video->queue_lock); > vb2_streamoff(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > video->queue = NULL; > video->error = false; > > /* TODO: Implement PM QoS */ > media_pipeline_stop(&video->video.entity); > - > media_entity_enum_cleanup(&pipe->ent_enum); > - > -done: > - mutex_unlock(&video->stream_lock); > return 0; > } > > @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) > queue->buf_struct_size = sizeof(struct isp_buffer); > queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > queue->dev = video->isp->dev; > + queue->lock = &video->queue_lock; > > ret = vb2_queue_init(&handle->queue); > if (ret < 0) { > @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) > struct v4l2_fh *vfh = file->private_data; > struct isp_video_fh *handle = to_isp_video_fh(vfh); > > + mutex_lock(&video->queue_lock); > /* Disable streaming and free the buffers queue resources. */ > isp_video_streamoff(file, vfh, video->type); > - > - mutex_lock(&video->queue_lock); > vb2_queue_release(&handle->queue); > mutex_unlock(&video->queue_lock); > > @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const char *name) > atomic_set(&video->active, 0); > > spin_lock_init(&video->pipe.lock); > - mutex_init(&video->stream_lock); > mutex_init(&video->queue_lock); > spin_lock_init(&video->irqlock); > > @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) > { > media_entity_cleanup(&video->video.entity); > mutex_destroy(&video->queue_lock); > - mutex_destroy(&video->stream_lock); > mutex_destroy(&video->mutex); > } > > diff --git a/drivers/media/platform/omap3isp/ispvideo.h b/drivers/media/platform/omap3isp/ispvideo.h > index f6a2082b4a0a..5a8fba85e0eb 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.h > +++ b/drivers/media/platform/omap3isp/ispvideo.h > @@ -167,7 +167,6 @@ struct isp_video { > > /* Pipeline state */ > struct isp_pipeline pipe; > - struct mutex stream_lock; /* pipeline and stream states */ > bool error; > > /* Video buffers queue */ > ^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v5 04/17] omap3isp: Add vb2_queue lock 2018-06-18 7:31 ` Hans Verkuil @ 2018-06-20 17:42 ` Ezequiel Garcia 2018-06-21 8:18 ` Hans Verkuil 2018-06-22 3:53 ` [PATCH v6 " Ezequiel Garcia 0 siblings, 2 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-20 17:42 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, and implement wait_{prepare, finish}. Also, remove stream_lock mutex. Sicen the ioctls operations are protected by the queue mutex, the stream_lock mutex is not needed. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ drivers/media/platform/omap3isp/ispvideo.h | 1 - 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index 9d228eac24ea..f835aeb9ddc5 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { .buf_prepare = isp_video_buffer_prepare, .buf_queue = isp_video_buffer_queue, .start_streaming = isp_video_start_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; /* @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int continuous) { struct isp_buffer *buf = NULL; - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { - mutex_lock(&video->queue_lock); + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) vb2_discard_done(video->queue); - mutex_unlock(&video->queue_lock); - } if (!list_empty(&video->dmaqueue)) { buf = list_first_entry(&video->dmaqueue, @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - - mutex_lock(&video->queue_lock); - ret = vb2_reqbufs(&vfh->queue, rb); - mutex_unlock(&video->queue_lock); - return ret; + return vb2_reqbufs(&vfh->queue, rb); } static int @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_querybuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_querybuf(&vfh->queue, b); } static int @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_qbuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_qbuf(&vfh->queue, b); } static int @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); } static int isp_video_check_external_subdevs(struct isp_video *video, @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Start streaming on the pipeline. No link touching an entity in the * pipeline can be activated or deactivated once streaming is started. */ @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); if (ret) - goto err_enum_init; + return ret; /* TODO: Implement PM QoS */ pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) atomic_set(&pipe->frame_number, -1); pipe->field = vfh->format.fmt.pix.field; - mutex_lock(&video->queue_lock); ret = vb2_streamon(&vfh->queue, type); - mutex_unlock(&video->queue_lock); if (ret < 0) goto err_check_format; - mutex_unlock(&video->stream_lock); - return 0; err_check_format: @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) media_entity_enum_cleanup(&pipe->ent_enum); -err_enum_init: - mutex_unlock(&video->stream_lock); - return ret; } @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Make sure we're not streaming yet. */ - mutex_lock(&video->queue_lock); streaming = vb2_is_streaming(&vfh->queue); - mutex_unlock(&video->queue_lock); - if (!streaming) - goto done; + return 0; /* Update the pipeline state. */ if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); omap3isp_video_cancel_stream(video); - mutex_lock(&video->queue_lock); vb2_streamoff(&vfh->queue, type); - mutex_unlock(&video->queue_lock); video->queue = NULL; video->error = false; /* TODO: Implement PM QoS */ media_pipeline_stop(&video->video.entity); - media_entity_enum_cleanup(&pipe->ent_enum); - -done: - mutex_unlock(&video->stream_lock); return 0; } @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) queue->buf_struct_size = sizeof(struct isp_buffer); queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; queue->dev = video->isp->dev; + queue->lock = &video->queue_lock; ret = vb2_queue_init(&handle->queue); if (ret < 0) { @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) struct v4l2_fh *vfh = file->private_data; struct isp_video_fh *handle = to_isp_video_fh(vfh); + mutex_lock(&video->queue_lock); /* Disable streaming and free the buffers queue resources. */ isp_video_streamoff(file, vfh, video->type); - - mutex_lock(&video->queue_lock); vb2_queue_release(&handle->queue); mutex_unlock(&video->queue_lock); @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const char *name) atomic_set(&video->active, 0); spin_lock_init(&video->pipe.lock); - mutex_init(&video->stream_lock); mutex_init(&video->queue_lock); spin_lock_init(&video->irqlock); @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) { media_entity_cleanup(&video->video.entity); mutex_destroy(&video->queue_lock); - mutex_destroy(&video->stream_lock); mutex_destroy(&video->mutex); } diff --git a/drivers/media/platform/omap3isp/ispvideo.h b/drivers/media/platform/omap3isp/ispvideo.h index f6a2082b4a0a..5a8fba85e0eb 100644 --- a/drivers/media/platform/omap3isp/ispvideo.h +++ b/drivers/media/platform/omap3isp/ispvideo.h @@ -167,7 +167,6 @@ struct isp_video { /* Pipeline state */ struct isp_pipeline pipe; - struct mutex stream_lock; /* pipeline and stream states */ bool error; /* Video buffers queue */ -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v5 04/17] omap3isp: Add vb2_queue lock 2018-06-20 17:42 ` [PATCH v5 " Ezequiel Garcia @ 2018-06-21 8:18 ` Hans Verkuil 2018-06-22 3:51 ` Ezequiel Garcia 2018-06-22 3:53 ` [PATCH v6 " Ezequiel Garcia 1 sibling, 1 reply; 28+ messages in thread From: Hans Verkuil @ 2018-06-21 8:18 UTC (permalink / raw) To: Ezequiel Garcia, linux-media; +Cc: Hans Verkuil, kernel On 06/20/18 19:42, Ezequiel Garcia wrote: > vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, > and implement wait_{prepare, finish}. > > Also, remove stream_lock mutex. Sicen the ioctls operations Sicen -> Since > are protected by the queue mutex, the stream_lock mutex is are protected -> are now protected > not needed. > > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > --- > drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ > drivers/media/platform/omap3isp/ispvideo.h | 1 - > 2 files changed, 11 insertions(+), 55 deletions(-) > > diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c > index 9d228eac24ea..f835aeb9ddc5 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.c > +++ b/drivers/media/platform/omap3isp/ispvideo.c > @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { > .buf_prepare = isp_video_buffer_prepare, > .buf_queue = isp_video_buffer_queue, > .start_streaming = isp_video_start_streaming, > + .wait_prepare = vb2_ops_wait_prepare, > + .wait_finish = vb2_ops_wait_finish, > }; > > /* > @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int continuous) > { > struct isp_buffer *buf = NULL; > > - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { > - mutex_lock(&video->queue_lock); > + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > vb2_discard_done(video->queue); > - mutex_unlock(&video->queue_lock); > - } > > if (!list_empty(&video->dmaqueue)) { > buf = list_first_entry(&video->dmaqueue, > @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > - > - mutex_lock(&video->queue_lock); > - ret = vb2_reqbufs(&vfh->queue, rb); > - mutex_unlock(&video->queue_lock); > > - return ret; > + return vb2_reqbufs(&vfh->queue, rb); > } > > static int > @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_querybuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_querybuf(&vfh->queue, b); > } > > static int > @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_qbuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_qbuf(&vfh->queue, b); > } > > static int > @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) > { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > } > > static int isp_video_check_external_subdevs(struct isp_video *video, > @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Start streaming on the pipeline. No link touching an entity in the > * pipeline can be activated or deactivated once streaming is started. > */ > @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); > if (ret) > - goto err_enum_init; > + return ret; > > /* TODO: Implement PM QoS */ > pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); > @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > atomic_set(&pipe->frame_number, -1); > pipe->field = vfh->format.fmt.pix.field; > > - mutex_lock(&video->queue_lock); > ret = vb2_streamon(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > if (ret < 0) > goto err_check_format; > > - mutex_unlock(&video->stream_lock); > - > return 0; > > err_check_format: > @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > media_entity_enum_cleanup(&pipe->ent_enum); > > -err_enum_init: > - mutex_unlock(&video->stream_lock); > - > return ret; > } > > @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Make sure we're not streaming yet. */ > - mutex_lock(&video->queue_lock); > streaming = vb2_is_streaming(&vfh->queue); > - mutex_unlock(&video->queue_lock); > - > if (!streaming) > - goto done; > + return 0; > > /* Update the pipeline state. */ > if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); > omap3isp_video_cancel_stream(video); > > - mutex_lock(&video->queue_lock); > vb2_streamoff(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > video->queue = NULL; > video->error = false; > > /* TODO: Implement PM QoS */ > media_pipeline_stop(&video->video.entity); > - > media_entity_enum_cleanup(&pipe->ent_enum); > - > -done: > - mutex_unlock(&video->stream_lock); > return 0; > } > > @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) > queue->buf_struct_size = sizeof(struct isp_buffer); > queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > queue->dev = video->isp->dev; > + queue->lock = &video->queue_lock; > > ret = vb2_queue_init(&handle->queue); > if (ret < 0) { > @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) > struct v4l2_fh *vfh = file->private_data; > struct isp_video_fh *handle = to_isp_video_fh(vfh); > > + mutex_lock(&video->queue_lock); > /* Disable streaming and free the buffers queue resources. */ > isp_video_streamoff(file, vfh, video->type); > - > - mutex_lock(&video->queue_lock); > vb2_queue_release(&handle->queue); > mutex_unlock(&video->queue_lock); Hmm, this mutex_unlock is not removed, did you miss this one? > > @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const char *name) > atomic_set(&video->active, 0); > > spin_lock_init(&video->pipe.lock); > - mutex_init(&video->stream_lock); > mutex_init(&video->queue_lock); > spin_lock_init(&video->irqlock); > > @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) > { > media_entity_cleanup(&video->video.entity); > mutex_destroy(&video->queue_lock); > - mutex_destroy(&video->stream_lock); > mutex_destroy(&video->mutex); > } > > diff --git a/drivers/media/platform/omap3isp/ispvideo.h b/drivers/media/platform/omap3isp/ispvideo.h > index f6a2082b4a0a..5a8fba85e0eb 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.h > +++ b/drivers/media/platform/omap3isp/ispvideo.h > @@ -167,7 +167,6 @@ struct isp_video { > > /* Pipeline state */ > struct isp_pipeline pipe; > - struct mutex stream_lock; /* pipeline and stream states */ > bool error; > > /* Video buffers queue */ > Regards, Hans ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v5 04/17] omap3isp: Add vb2_queue lock 2018-06-21 8:18 ` Hans Verkuil @ 2018-06-22 3:51 ` Ezequiel Garcia 0 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-22 3:51 UTC (permalink / raw) To: Hans Verkuil, linux-media; +Cc: Hans Verkuil, kernel On Thu, 2018-06-21 at 10:18 +0200, Hans Verkuil wrote: > On 06/20/18 19:42, Ezequiel Garcia wrote: > > vb2_queue locks is now mandatory. Add it, remove driver ad-hoc > > locks, > > and implement wait_{prepare, finish}. > > > > Also, remove stream_lock mutex. Sicen the ioctls operations > > Sicen -> Since > > > are protected by the queue mutex, the stream_lock mutex is > > are protected -> are now protected > Will fix. [snip] > > @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file > > *file) > > > > struct v4l2_fh *vfh = file->private_data; > > struct isp_video_fh *handle = to_isp_video_fh(vfh); > > > > + mutex_lock(&video->queue_lock); See below. > > /* Disable streaming and free the buffers queue resources. > > */ > > isp_video_streamoff(file, vfh, video->type); > > - > > - mutex_lock(&video->queue_lock); > > vb2_queue_release(&handle->queue); > > mutex_unlock(&video->queue_lock); > > Hmm, this mutex_unlock is not removed, did you miss this one? > The mutex_lock call is moved before the call to isp_video_streamoff, because .streamoff is called with the queue lock held, and so it seemed more consistent. I will send a v6 with the amended commit log. Let me know if you catch anything else, it's a long series and the devil is always in the detail! Thanks, Eze ^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v6 04/17] omap3isp: Add vb2_queue lock 2018-06-20 17:42 ` [PATCH v5 " Ezequiel Garcia 2018-06-21 8:18 ` Hans Verkuil @ 2018-06-22 3:53 ` Ezequiel Garcia 2018-07-02 16:49 ` Laurent Pinchart 1 sibling, 1 reply; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-22 3:53 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, and implement wait_{prepare, finish}. Also, remove stream_lock mutex. Since the ioctls operations are now protected by the queue mutex, the stream_lock mutex is not needed. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ drivers/media/platform/omap3isp/ispvideo.h | 1 - 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index 9d228eac24ea..f835aeb9ddc5 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { .buf_prepare = isp_video_buffer_prepare, .buf_queue = isp_video_buffer_queue, .start_streaming = isp_video_start_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; /* @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int continuous) { struct isp_buffer *buf = NULL; - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { - mutex_lock(&video->queue_lock); + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) vb2_discard_done(video->queue); - mutex_unlock(&video->queue_lock); - } if (!list_empty(&video->dmaqueue)) { buf = list_first_entry(&video->dmaqueue, @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - - mutex_lock(&video->queue_lock); - ret = vb2_reqbufs(&vfh->queue, rb); - mutex_unlock(&video->queue_lock); - return ret; + return vb2_reqbufs(&vfh->queue, rb); } static int @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_querybuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_querybuf(&vfh->queue, b); } static int @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_qbuf(&vfh->queue, b); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_qbuf(&vfh->queue, b); } static int @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *b) { struct isp_video_fh *vfh = to_isp_video_fh(fh); struct isp_video *video = video_drvdata(file); - int ret; - mutex_lock(&video->queue_lock); - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); - mutex_unlock(&video->queue_lock); - - return ret; + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); } static int isp_video_check_external_subdevs(struct isp_video *video, @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Start streaming on the pipeline. No link touching an entity in the * pipeline can be activated or deactivated once streaming is started. */ @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); if (ret) - goto err_enum_init; + return ret; /* TODO: Implement PM QoS */ pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) atomic_set(&pipe->frame_number, -1); pipe->field = vfh->format.fmt.pix.field; - mutex_lock(&video->queue_lock); ret = vb2_streamon(&vfh->queue, type); - mutex_unlock(&video->queue_lock); if (ret < 0) goto err_check_format; - mutex_unlock(&video->stream_lock); - return 0; err_check_format: @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) media_entity_enum_cleanup(&pipe->ent_enum); -err_enum_init: - mutex_unlock(&video->stream_lock); - return ret; } @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) if (type != video->type) return -EINVAL; - mutex_lock(&video->stream_lock); - /* Make sure we're not streaming yet. */ - mutex_lock(&video->queue_lock); streaming = vb2_is_streaming(&vfh->queue); - mutex_unlock(&video->queue_lock); - if (!streaming) - goto done; + return 0; /* Update the pipeline state. */ if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); omap3isp_video_cancel_stream(video); - mutex_lock(&video->queue_lock); vb2_streamoff(&vfh->queue, type); - mutex_unlock(&video->queue_lock); video->queue = NULL; video->error = false; /* TODO: Implement PM QoS */ media_pipeline_stop(&video->video.entity); - media_entity_enum_cleanup(&pipe->ent_enum); - -done: - mutex_unlock(&video->stream_lock); return 0; } @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) queue->buf_struct_size = sizeof(struct isp_buffer); queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; queue->dev = video->isp->dev; + queue->lock = &video->queue_lock; ret = vb2_queue_init(&handle->queue); if (ret < 0) { @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) struct v4l2_fh *vfh = file->private_data; struct isp_video_fh *handle = to_isp_video_fh(vfh); + mutex_lock(&video->queue_lock); /* Disable streaming and free the buffers queue resources. */ isp_video_streamoff(file, vfh, video->type); - - mutex_lock(&video->queue_lock); vb2_queue_release(&handle->queue); mutex_unlock(&video->queue_lock); @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const char *name) atomic_set(&video->active, 0); spin_lock_init(&video->pipe.lock); - mutex_init(&video->stream_lock); mutex_init(&video->queue_lock); spin_lock_init(&video->irqlock); @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) { media_entity_cleanup(&video->video.entity); mutex_destroy(&video->queue_lock); - mutex_destroy(&video->stream_lock); mutex_destroy(&video->mutex); } diff --git a/drivers/media/platform/omap3isp/ispvideo.h b/drivers/media/platform/omap3isp/ispvideo.h index f6a2082b4a0a..5a8fba85e0eb 100644 --- a/drivers/media/platform/omap3isp/ispvideo.h +++ b/drivers/media/platform/omap3isp/ispvideo.h @@ -167,7 +167,6 @@ struct isp_video { /* Pipeline state */ struct isp_pipeline pipe; - struct mutex stream_lock; /* pipeline and stream states */ bool error; /* Video buffers queue */ -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v6 04/17] omap3isp: Add vb2_queue lock 2018-06-22 3:53 ` [PATCH v6 " Ezequiel Garcia @ 2018-07-02 16:49 ` Laurent Pinchart 2018-07-06 15:11 ` Ezequiel Garcia 0 siblings, 1 reply; 28+ messages in thread From: Laurent Pinchart @ 2018-07-02 16:49 UTC (permalink / raw) To: Ezequiel Garcia; +Cc: linux-media, Hans Verkuil, kernel, sakari.ailus Hi Ezequiel, (CC'ing Sakari) Thank you for the patch. On Friday, 22 June 2018 06:53:58 EEST Ezequiel Garcia wrote: > vb2_queue locks is now mandatory. Add it, remove driver ad-hoc locks, > and implement wait_{prepare, finish}. > > Also, remove stream_lock mutex. Since the ioctls operations > are now protected by the queue mutex, the stream_lock mutex is > not needed. > > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > --- > drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------------ > drivers/media/platform/omap3isp/ispvideo.h | 1 - > 2 files changed, 11 insertions(+), 55 deletions(-) > > diff --git a/drivers/media/platform/omap3isp/ispvideo.c > b/drivers/media/platform/omap3isp/ispvideo.c index > 9d228eac24ea..f835aeb9ddc5 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.c > +++ b/drivers/media/platform/omap3isp/ispvideo.c > @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops = { > .buf_prepare = isp_video_buffer_prepare, > .buf_queue = isp_video_buffer_queue, > .start_streaming = isp_video_start_streaming, > + .wait_prepare = vb2_ops_wait_prepare, > + .wait_finish = vb2_ops_wait_finish, > }; > > /* > @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video *video, int > continuous) { > struct isp_buffer *buf = NULL; > > - if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { > - mutex_lock(&video->queue_lock); > + if (continuous && video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > vb2_discard_done(video->queue); > - mutex_unlock(&video->queue_lock); > - } Why can locking be removed here ? As far as I know the lock isn't taken by the caller. It would help to explain the rationale in the commit message. > if (!list_empty(&video->dmaqueue)) { > buf = list_first_entry(&video->dmaqueue, > @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, struct > v4l2_requestbuffers *rb) { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); The video variable isn't used anymore. Didn't gcc warn you ? > - int ret; > - > - mutex_lock(&video->queue_lock); > - ret = vb2_reqbufs(&vfh->queue, rb); > - mutex_unlock(&video->queue_lock); > > - return ret; > + return vb2_reqbufs(&vfh->queue, rb); > } > > static int > @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void *fh, struct > v4l2_buffer *b) { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); Same here and in other functions below. > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_querybuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_querybuf(&vfh->queue, b); > } > > static int > @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, struct > v4l2_buffer *b) { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_qbuf(&vfh->queue, b); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_qbuf(&vfh->queue, b); > } > > static int > @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, struct > v4l2_buffer *b) { > struct isp_video_fh *vfh = to_isp_video_fh(fh); > struct isp_video *video = video_drvdata(file); > - int ret; > > - mutex_lock(&video->queue_lock); > - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > - mutex_unlock(&video->queue_lock); > - > - return ret; > + return vb2_dqbuf(&vfh->queue, b, file->f_flags & O_NONBLOCK); > } > > static int isp_video_check_external_subdevs(struct isp_video *video, > @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void *fh, enum > v4l2_buf_type type) if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Start streaming on the pipeline. No link touching an entity in the > * pipeline can be activated or deactivated once streaming is started. > */ > @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void *fh, enum > v4l2_buf_type type) > > ret = media_entity_enum_init(&pipe->ent_enum, &video->isp->media_dev); > if (ret) > - goto err_enum_init; > + return ret; > > /* TODO: Implement PM QoS */ > pipe->l3_ick = clk_get_rate(video->isp->clock[ISP_CLK_L3_ICK]); > @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void *fh, enum > v4l2_buf_type type) atomic_set(&pipe->frame_number, -1); > pipe->field = vfh->format.fmt.pix.field; > > - mutex_lock(&video->queue_lock); > ret = vb2_streamon(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > if (ret < 0) > goto err_check_format; > > - mutex_unlock(&video->stream_lock); > - > return 0; > > err_check_format: > @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void *fh, enum > v4l2_buf_type type) > > media_entity_enum_cleanup(&pipe->ent_enum); > > -err_enum_init: > - mutex_unlock(&video->stream_lock); > - > return ret; > } > > @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void *fh, > enum v4l2_buf_type type) if (type != video->type) > return -EINVAL; > > - mutex_lock(&video->stream_lock); > - > /* Make sure we're not streaming yet. */ > - mutex_lock(&video->queue_lock); > streaming = vb2_is_streaming(&vfh->queue); > - mutex_unlock(&video->queue_lock); > - > if (!streaming) > - goto done; > + return 0; > > /* Update the pipeline state. */ > if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void *fh, > enum v4l2_buf_type type) > omap3isp_pipeline_set_stream(pipe, ISP_PIPELINE_STREAM_STOPPED); With this patch, the omap3isp_pipeline_set_stream() function will wait for the pipeline to stop with the queue lock held. This means that all concurrent access to buffer-related functions (and in particular DQBUF and and poll()) will potentially wait for much longer than they do now. Could this be a problem ? Could waiting for the pipeline to stop with the lock held also cause other problems than that ? > omap3isp_video_cancel_stream(video); > > - mutex_lock(&video->queue_lock); > vb2_streamoff(&vfh->queue, type); > - mutex_unlock(&video->queue_lock); > video->queue = NULL; > video->error = false; > > /* TODO: Implement PM QoS */ > media_pipeline_stop(&video->video.entity); > - > media_entity_enum_cleanup(&pipe->ent_enum); > - > -done: > - mutex_unlock(&video->stream_lock); > return 0; > } > > @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) > queue->buf_struct_size = sizeof(struct isp_buffer); > queue->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > queue->dev = video->isp->dev; > + queue->lock = &video->queue_lock; > > ret = vb2_queue_init(&handle->queue); > if (ret < 0) { > @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file *file) > struct v4l2_fh *vfh = file->private_data; > struct isp_video_fh *handle = to_isp_video_fh(vfh); > > + mutex_lock(&video->queue_lock); > /* Disable streaming and free the buffers queue resources. */ > isp_video_streamoff(file, vfh, video->type); > - > - mutex_lock(&video->queue_lock); > vb2_queue_release(&handle->queue); > mutex_unlock(&video->queue_lock); > > @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video *video, const > char *name) atomic_set(&video->active, 0); > > spin_lock_init(&video->pipe.lock); > - mutex_init(&video->stream_lock); > mutex_init(&video->queue_lock); > spin_lock_init(&video->irqlock); > > @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video *video) > { > media_entity_cleanup(&video->video.entity); > mutex_destroy(&video->queue_lock); > - mutex_destroy(&video->stream_lock); > mutex_destroy(&video->mutex); > } > > diff --git a/drivers/media/platform/omap3isp/ispvideo.h > b/drivers/media/platform/omap3isp/ispvideo.h index > f6a2082b4a0a..5a8fba85e0eb 100644 > --- a/drivers/media/platform/omap3isp/ispvideo.h > +++ b/drivers/media/platform/omap3isp/ispvideo.h > @@ -167,7 +167,6 @@ struct isp_video { > > /* Pipeline state */ > struct isp_pipeline pipe; > - struct mutex stream_lock; /* pipeline and stream states */ The queue_lock now covers more than just the queue, please update the comment to list the fields that are protected by the mutex. > bool error; > > /* Video buffers queue */ -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v6 04/17] omap3isp: Add vb2_queue lock 2018-07-02 16:49 ` Laurent Pinchart @ 2018-07-06 15:11 ` Ezequiel Garcia 0 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-07-06 15:11 UTC (permalink / raw) To: Laurent Pinchart; +Cc: linux-media, Hans Verkuil, kernel, sakari.ailus On Mon, 2018-07-02 at 19:49 +0300, Laurent Pinchart wrote: > Hi Ezequiel, > > (CC'ing Sakari) > > Thank you for the patch. > > On Friday, 22 June 2018 06:53:58 EEST Ezequiel Garcia wrote: > > vb2_queue locks is now mandatory. Add it, remove driver ad-hoc > > locks, > > and implement wait_{prepare, finish}. > > > > Also, remove stream_lock mutex. Since the ioctls operations > > are now protected by the queue mutex, the stream_lock mutex is > > not needed. > > > > Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> > > --- > > drivers/media/platform/omap3isp/ispvideo.c | 65 ++++------------ > > ------ > > drivers/media/platform/omap3isp/ispvideo.h | 1 - > > 2 files changed, 11 insertions(+), 55 deletions(-) > > > > diff --git a/drivers/media/platform/omap3isp/ispvideo.c > > b/drivers/media/platform/omap3isp/ispvideo.c index > > 9d228eac24ea..f835aeb9ddc5 100644 > > --- a/drivers/media/platform/omap3isp/ispvideo.c > > +++ b/drivers/media/platform/omap3isp/ispvideo.c > > @@ -496,6 +496,8 @@ static const struct vb2_ops isp_video_queue_ops > > = { > > .buf_prepare = isp_video_buffer_prepare, > > .buf_queue = isp_video_buffer_queue, > > .start_streaming = isp_video_start_streaming, > > + .wait_prepare = vb2_ops_wait_prepare, > > + .wait_finish = vb2_ops_wait_finish, > > }; > > > > /* > > @@ -628,11 +630,8 @@ void omap3isp_video_resume(struct isp_video > > *video, int > > continuous) { > > struct isp_buffer *buf = NULL; > > > > - if (continuous && video->type == > > V4L2_BUF_TYPE_VIDEO_CAPTURE) { > > - mutex_lock(&video->queue_lock); > > + if (continuous && video->type == > > V4L2_BUF_TYPE_VIDEO_CAPTURE) > > vb2_discard_done(video->queue); > > - mutex_unlock(&video->queue_lock); > > - } > > Why can locking be removed here ? As far as I know the lock isn't > taken by the > caller. It would help to explain the rationale in the commit message. > AFAICS, vb2_discard_done() simply iterates over a list, and it's protected by a spinlock. It's already thread-safe. > > if (!list_empty(&video->dmaqueue)) { > > buf = list_first_entry(&video->dmaqueue, > > @@ -909,13 +908,8 @@ isp_video_reqbufs(struct file *file, void *fh, > > struct > > v4l2_requestbuffers *rb) { > > struct isp_video_fh *vfh = to_isp_video_fh(fh); > > struct isp_video *video = video_drvdata(file); > > The video variable isn't used anymore. Didn't gcc warn you ? > Hm, I don't remember getting warnings. > > - int ret; > > - > > - mutex_lock(&video->queue_lock); > > - ret = vb2_reqbufs(&vfh->queue, rb); > > - mutex_unlock(&video->queue_lock); > > > > - return ret; > > + return vb2_reqbufs(&vfh->queue, rb); > > } > > > > static int > > @@ -923,13 +917,8 @@ isp_video_querybuf(struct file *file, void > > *fh, struct > > v4l2_buffer *b) { > > struct isp_video_fh *vfh = to_isp_video_fh(fh); > > struct isp_video *video = video_drvdata(file); > > Same here and in other functions below. > > > - int ret; > > > > - mutex_lock(&video->queue_lock); > > - ret = vb2_querybuf(&vfh->queue, b); > > - mutex_unlock(&video->queue_lock); > > - > > - return ret; > > + return vb2_querybuf(&vfh->queue, b); > > } > > > > static int > > @@ -937,13 +926,8 @@ isp_video_qbuf(struct file *file, void *fh, > > struct > > v4l2_buffer *b) { > > struct isp_video_fh *vfh = to_isp_video_fh(fh); > > struct isp_video *video = video_drvdata(file); > > - int ret; > > > > - mutex_lock(&video->queue_lock); > > - ret = vb2_qbuf(&vfh->queue, b); > > - mutex_unlock(&video->queue_lock); > > - > > - return ret; > > + return vb2_qbuf(&vfh->queue, b); > > } > > > > static int > > @@ -951,13 +935,8 @@ isp_video_dqbuf(struct file *file, void *fh, > > struct > > v4l2_buffer *b) { > > struct isp_video_fh *vfh = to_isp_video_fh(fh); > > struct isp_video *video = video_drvdata(file); > > - int ret; > > > > - mutex_lock(&video->queue_lock); > > - ret = vb2_dqbuf(&vfh->queue, b, file->f_flags & > > O_NONBLOCK); > > - mutex_unlock(&video->queue_lock); > > - > > - return ret; > > + return vb2_dqbuf(&vfh->queue, b, file->f_flags & > > O_NONBLOCK); > > } > > > > static int isp_video_check_external_subdevs(struct isp_video > > *video, > > @@ -1096,8 +1075,6 @@ isp_video_streamon(struct file *file, void > > *fh, enum > > v4l2_buf_type type) if (type != video->type) > > return -EINVAL; > > > > - mutex_lock(&video->stream_lock); > > - > > /* Start streaming on the pipeline. No link touching an > > entity in the > > * pipeline can be activated or deactivated once streaming > > is started. > > */ > > @@ -1106,7 +1083,7 @@ isp_video_streamon(struct file *file, void > > *fh, enum > > v4l2_buf_type type) > > > > ret = media_entity_enum_init(&pipe->ent_enum, &video->isp- > > >media_dev); > > if (ret) > > - goto err_enum_init; > > + return ret; > > > > /* TODO: Implement PM QoS */ > > pipe->l3_ick = clk_get_rate(video->isp- > > >clock[ISP_CLK_L3_ICK]); > > @@ -1158,14 +1135,10 @@ isp_video_streamon(struct file *file, void > > *fh, enum > > v4l2_buf_type type) atomic_set(&pipe->frame_number, -1); > > pipe->field = vfh->format.fmt.pix.field; > > > > - mutex_lock(&video->queue_lock); > > ret = vb2_streamon(&vfh->queue, type); > > - mutex_unlock(&video->queue_lock); > > if (ret < 0) > > goto err_check_format; > > > > - mutex_unlock(&video->stream_lock); > > - > > return 0; > > > > err_check_format: > > @@ -1184,9 +1157,6 @@ isp_video_streamon(struct file *file, void > > *fh, enum > > v4l2_buf_type type) > > > > media_entity_enum_cleanup(&pipe->ent_enum); > > > > -err_enum_init: > > - mutex_unlock(&video->stream_lock); > > - > > return ret; > > } > > > > @@ -1203,15 +1173,10 @@ isp_video_streamoff(struct file *file, void > > *fh, > > enum v4l2_buf_type type) if (type != video->type) > > return -EINVAL; > > > > - mutex_lock(&video->stream_lock); > > - > > /* Make sure we're not streaming yet. */ > > - mutex_lock(&video->queue_lock); > > streaming = vb2_is_streaming(&vfh->queue); > > - mutex_unlock(&video->queue_lock); > > - > > if (!streaming) > > - goto done; > > + return 0; > > > > /* Update the pipeline state. */ > > if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) > > @@ -1229,19 +1194,13 @@ isp_video_streamoff(struct file *file, void > > *fh, > > enum v4l2_buf_type type) > > omap3isp_pipeline_set_stream(pipe, > > ISP_PIPELINE_STREAM_STOPPED); > > With this patch, the omap3isp_pipeline_set_stream() function will > wait for the > pipeline to stop with the queue lock held. This means that all > concurrent > access to buffer-related functions (and in particular DQBUF and and > poll()) > will potentially wait for much longer than they do now. Could this be > a > problem ? Could waiting for the pipeline to stop with the lock held > also cause > other problems than that ? > Yes, I can see that now. It will only cause problems if the subdev calls, then try to take the queue lock, either directly or by re- entering into the driver. I don't have access to this hardware, so I do not have other answers. > > omap3isp_video_cancel_stream(video); > > > > - mutex_lock(&video->queue_lock); > > vb2_streamoff(&vfh->queue, type); > > - mutex_unlock(&video->queue_lock); > > video->queue = NULL; > > video->error = false; > > > > /* TODO: Implement PM QoS */ > > media_pipeline_stop(&video->video.entity); > > - > > media_entity_enum_cleanup(&pipe->ent_enum); > > - > > -done: > > - mutex_unlock(&video->stream_lock); > > return 0; > > } > > > > @@ -1333,6 +1292,7 @@ static int isp_video_open(struct file *file) > > queue->buf_struct_size = sizeof(struct isp_buffer); > > queue->timestamp_flags = > > V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; > > queue->dev = video->isp->dev; > > + queue->lock = &video->queue_lock; > > > > ret = vb2_queue_init(&handle->queue); > > if (ret < 0) { > > @@ -1363,10 +1323,9 @@ static int isp_video_release(struct file > > *file) > > struct v4l2_fh *vfh = file->private_data; > > struct isp_video_fh *handle = to_isp_video_fh(vfh); > > > > + mutex_lock(&video->queue_lock); > > /* Disable streaming and free the buffers queue resources. > > */ > > isp_video_streamoff(file, vfh, video->type); > > - > > - mutex_lock(&video->queue_lock); > > vb2_queue_release(&handle->queue); > > mutex_unlock(&video->queue_lock); > > > > @@ -1449,7 +1408,6 @@ int omap3isp_video_init(struct isp_video > > *video, const > > char *name) atomic_set(&video->active, 0); > > > > spin_lock_init(&video->pipe.lock); > > - mutex_init(&video->stream_lock); > > mutex_init(&video->queue_lock); > > spin_lock_init(&video->irqlock); > > > > @@ -1474,7 +1432,6 @@ void omap3isp_video_cleanup(struct isp_video > > *video) > > { > > media_entity_cleanup(&video->video.entity); > > mutex_destroy(&video->queue_lock); > > - mutex_destroy(&video->stream_lock); > > mutex_destroy(&video->mutex); > > } > > > > diff --git a/drivers/media/platform/omap3isp/ispvideo.h > > b/drivers/media/platform/omap3isp/ispvideo.h index > > f6a2082b4a0a..5a8fba85e0eb 100644 > > --- a/drivers/media/platform/omap3isp/ispvideo.h > > +++ b/drivers/media/platform/omap3isp/ispvideo.h > > @@ -167,7 +167,6 @@ struct isp_video { > > > > /* Pipeline state */ > > struct isp_pipeline pipe; > > - struct mutex stream_lock; /* pipeline and stream > > states */ > > The queue_lock now covers more than just the queue, please update the > comment > to list the fields that are protected by the mutex. > > Right. ^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH v4 05/17] mtk-mdp: Add locks for capture and output vb2_queues 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (3 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 04/17] omap3isp: " Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 06/17] s5p-g2d: Implement wait_prepare and wait_finish Ezequiel Garcia ` (12 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia Use the mutex in struct mtk_mdp_ctx to protect the capture and output vb2_queues. This allows to replace the ad-hoc wait_{prepare, finish} with vb2_ops_wait_{prepare, finish}. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c index 583d47724ee8..c2e2f5f1ebf1 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c @@ -394,20 +394,6 @@ static bool mtk_mdp_ctx_state_is_set(struct mtk_mdp_ctx *ctx, u32 mask) return ret; } -static void mtk_mdp_ctx_lock(struct vb2_queue *vq) -{ - struct mtk_mdp_ctx *ctx = vb2_get_drv_priv(vq); - - mutex_lock(&ctx->mdp_dev->lock); -} - -static void mtk_mdp_ctx_unlock(struct vb2_queue *vq) -{ - struct mtk_mdp_ctx *ctx = vb2_get_drv_priv(vq); - - mutex_unlock(&ctx->mdp_dev->lock); -} - static void mtk_mdp_set_frame_size(struct mtk_mdp_frame *frame, int width, int height) { @@ -625,10 +611,10 @@ static const struct vb2_ops mtk_mdp_m2m_qops = { .queue_setup = mtk_mdp_m2m_queue_setup, .buf_prepare = mtk_mdp_m2m_buf_prepare, .buf_queue = mtk_mdp_m2m_buf_queue, - .wait_prepare = mtk_mdp_ctx_unlock, - .wait_finish = mtk_mdp_ctx_lock, .stop_streaming = mtk_mdp_m2m_stop_streaming, .start_streaming = mtk_mdp_m2m_start_streaming, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static int mtk_mdp_m2m_querycap(struct file *file, void *fh, @@ -996,6 +982,7 @@ static int mtk_mdp_m2m_queue_init(void *priv, struct vb2_queue *src_vq, src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; src_vq->dev = &ctx->mdp_dev->pdev->dev; + src_vq->lock = &ctx->mdp_dev->lock; ret = vb2_queue_init(src_vq); if (ret) @@ -1010,6 +997,7 @@ static int mtk_mdp_m2m_queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; dst_vq->dev = &ctx->mdp_dev->pdev->dev; + dst_vq->lock = &ctx->mdp_dev->lock; return vb2_queue_init(dst_vq); } -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 06/17] s5p-g2d: Implement wait_prepare and wait_finish 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (4 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 05/17] mtk-mdp: Add locks for capture and output vb2_queues Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 07/17] staging: bcm2835-camera: Provide lock for vb2_queue Ezequiel Garcia ` (11 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia This driver is currently specifying a vb2_queue lock, which means it straightforward to implement wait_prepare and wait_finish. Having these callbacks releases the queue lock while blocking, which improves latency by allowing for example streamoff or qbuf operations while waiting in dqbuf. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/s5p-g2d/g2d.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c index 66aa8cf1d048..ce4280730835 100644 --- a/drivers/media/platform/s5p-g2d/g2d.c +++ b/drivers/media/platform/s5p-g2d/g2d.c @@ -142,6 +142,8 @@ static const struct vb2_ops g2d_qops = { .queue_setup = g2d_queue_setup, .buf_prepare = g2d_buf_prepare, .buf_queue = g2d_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 07/17] staging: bcm2835-camera: Provide lock for vb2_queue 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (5 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 06/17] s5p-g2d: Implement wait_prepare and wait_finish Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 08/17] venus: Add video_device and vb2_queue locks Ezequiel Garcia ` (10 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia Use the device mutex to protect the vb2_queue. This allows to replace the ad-hoc wait_{prepare, finish} with vb2_ops_wait_{prepare, finish}. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- .../bcm2835-camera/bcm2835-camera.c | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c index ce26741ae9d9..6dd0c838db05 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -628,20 +628,6 @@ static void stop_streaming(struct vb2_queue *vq) v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n"); } -static void bm2835_mmal_lock(struct vb2_queue *vq) -{ - struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vq); - - mutex_lock(&dev->mutex); -} - -static void bm2835_mmal_unlock(struct vb2_queue *vq) -{ - struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vq); - - mutex_unlock(&dev->mutex); -} - static const struct vb2_ops bm2835_mmal_video_qops = { .queue_setup = queue_setup, .buf_init = buffer_init, @@ -650,8 +636,8 @@ static const struct vb2_ops bm2835_mmal_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = bm2835_mmal_unlock, - .wait_finish = bm2835_mmal_lock, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; /* ------------------------------------------------------------------ @@ -1864,6 +1850,8 @@ static int bcm2835_mmal_probe(struct platform_device *pdev) goto cleanup_gdev; } + /* v4l2 core mutex used to protect all fops and v4l2 ioctls. */ + mutex_init(&dev->mutex); dev->camera_num = camera; dev->max_width = resolutions[camera][0]; dev->max_height = resolutions[camera][1]; @@ -1908,13 +1896,11 @@ static int bcm2835_mmal_probe(struct platform_device *pdev) q->ops = &bm2835_mmal_video_qops; q->mem_ops = &vb2_vmalloc_memops; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; + q->lock = &dev->mutex; ret = vb2_queue_init(q); if (ret < 0) goto unreg_dev; - /* v4l2 core mutex used to protect all fops and v4l2 ioctls. */ - mutex_init(&dev->mutex); - /* initialise video devices */ ret = bm2835_mmal_init_device(dev, &dev->vdev); if (ret < 0) -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 08/17] venus: Add video_device and vb2_queue locks 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (6 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 07/17] staging: bcm2835-camera: Provide lock for vb2_queue Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 09/17] davinci_vpfe: " Ezequiel Garcia ` (9 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia video_device and vb2_queue locks are now both mandatory. Add them, remove driver ad-hoc locking, and implement wait_{prepare, 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> --- drivers/media/platform/qcom/venus/core.h | 4 +++- drivers/media/platform/qcom/venus/helpers.c | 16 ++++++------- drivers/media/platform/qcom/venus/vdec.c | 25 +++++++++------------ drivers/media/platform/qcom/venus/venc.c | 19 ++++++++-------- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h index 0360d295f4c8..5617d0af990f 100644 --- a/drivers/media/platform/qcom/venus/core.h +++ b/drivers/media/platform/qcom/venus/core.h @@ -102,6 +102,8 @@ struct venus_core { struct device *dev_dec; struct device *dev_enc; struct mutex lock; + struct mutex dec_lock; + struct mutex enc_lock; struct list_head instances; atomic_t insts_count; unsigned int state; @@ -243,7 +245,7 @@ struct venus_buffer { */ struct venus_inst { struct list_head list; - struct mutex lock; + struct mutex *lock; struct venus_core *core; struct list_head internalbufs; struct list_head registeredbufs; diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c index 0ce9559a2924..5a2dda6fb984 100644 --- a/drivers/media/platform/qcom/venus/helpers.c +++ b/drivers/media/platform/qcom/venus/helpers.c @@ -512,7 +512,7 @@ static void delayed_process_buf_func(struct work_struct *work) inst = container_of(work, struct venus_inst, delayed_process_work); - mutex_lock(&inst->lock); + mutex_lock(inst->lock); if (!(inst->streamon_out & inst->streamon_cap)) goto unlock; @@ -528,7 +528,7 @@ static void delayed_process_buf_func(struct work_struct *work) list_del_init(&buf->ref_list); } unlock: - mutex_unlock(&inst->lock); + mutex_unlock(inst->lock); } void venus_helper_release_buf_ref(struct venus_inst *inst, unsigned int idx) @@ -621,7 +621,7 @@ void venus_helper_vb2_buf_queue(struct vb2_buffer *vb) struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; int ret; - mutex_lock(&inst->lock); + mutex_lock(inst->lock); v4l2_m2m_buf_queue(m2m_ctx, vbuf); @@ -637,7 +637,7 @@ void venus_helper_vb2_buf_queue(struct vb2_buffer *vb) return_buf_error(inst, vbuf); unlock: - mutex_unlock(&inst->lock); + mutex_unlock(inst->lock); } EXPORT_SYMBOL_GPL(venus_helper_vb2_buf_queue); @@ -659,7 +659,7 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) struct venus_core *core = inst->core; int ret; - mutex_lock(&inst->lock); + mutex_lock(inst->lock); if (inst->streamon_out & inst->streamon_cap) { ret = hfi_session_stop(inst); @@ -685,7 +685,7 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) else inst->streamon_cap = 0; - mutex_unlock(&inst->lock); + mutex_unlock(inst->lock); } EXPORT_SYMBOL_GPL(venus_helper_vb2_stop_streaming); @@ -731,7 +731,7 @@ void venus_helper_m2m_device_run(void *priv) struct v4l2_m2m_buffer *buf, *n; int ret; - mutex_lock(&inst->lock); + mutex_lock(inst->lock); v4l2_m2m_for_each_dst_buf_safe(m2m_ctx, buf, n) { ret = session_process_buf(inst, &buf->vb); @@ -745,7 +745,7 @@ void venus_helper_m2m_device_run(void *priv) return_buf_error(inst, &buf->vb); } - mutex_unlock(&inst->lock); + mutex_unlock(inst->lock); } EXPORT_SYMBOL_GPL(venus_helper_m2m_device_run); diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c index 49bbd1861d3a..41d14df46f5d 100644 --- a/drivers/media/platform/qcom/venus/vdec.c +++ b/drivers/media/platform/qcom/venus/vdec.c @@ -493,14 +493,12 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd) if (ret) return ret; - mutex_lock(&inst->lock); - /* * Implement V4L2_DEC_CMD_STOP by enqueue an empty buffer on decoder * input to signal EOS. */ if (!(inst->streamon_out & inst->streamon_cap)) - goto unlock; + return 0; fdata.buffer_type = HFI_BUFFER_INPUT; fdata.flags |= HFI_BUFFERFLAG_EOS; @@ -508,8 +506,6 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd) ret = hfi_session_process_buf(inst, &fdata); -unlock: - mutex_unlock(&inst->lock); return ret; } @@ -720,17 +716,13 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count) u32 ptype; int ret; - mutex_lock(&inst->lock); - if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) inst->streamon_out = 1; else inst->streamon_cap = 1; - if (!(inst->streamon_out & inst->streamon_cap)) { - mutex_unlock(&inst->lock); + if (!(inst->streamon_out & inst->streamon_cap)) return 0; - } venus_helper_init_instance(inst); @@ -771,8 +763,6 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count) if (ret) goto deinit_sess; - mutex_unlock(&inst->lock); - return 0; deinit_sess: @@ -783,7 +773,6 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count) inst->streamon_out = 0; else inst->streamon_cap = 0; - mutex_unlock(&inst->lock); return ret; } @@ -794,6 +783,8 @@ static const struct vb2_ops vdec_vb2_ops = { .start_streaming = vdec_start_streaming, .stop_streaming = venus_helper_vb2_stop_streaming, .buf_queue = venus_helper_vb2_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static void vdec_buf_done(struct venus_inst *inst, unsigned int buf_type, @@ -940,6 +931,7 @@ static int m2m_queue_init(void *priv, struct vb2_queue *src_vq, src_vq->allow_zero_bytesused = 1; src_vq->min_buffers_needed = 1; src_vq->dev = inst->core->dev; + src_vq->lock = &inst->core->dec_lock; ret = vb2_queue_init(src_vq); if (ret) return ret; @@ -954,6 +946,7 @@ static int m2m_queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->allow_zero_bytesused = 1; dst_vq->min_buffers_needed = 1; dst_vq->dev = inst->core->dev; + dst_vq->lock = &inst->core->dec_lock; ret = vb2_queue_init(dst_vq); if (ret) { vb2_queue_release(src_vq); @@ -976,9 +969,9 @@ static int vdec_open(struct file *file) INIT_LIST_HEAD(&inst->registeredbufs); INIT_LIST_HEAD(&inst->internalbufs); INIT_LIST_HEAD(&inst->list); - mutex_init(&inst->lock); inst->core = core; + inst->lock = &core->dec_lock; inst->session_type = VIDC_SESSION_TYPE_DEC; inst->num_output_bufs = 1; @@ -1044,7 +1037,6 @@ static int vdec_close(struct file *file) v4l2_m2m_release(inst->m2m_dev); vdec_ctrl_deinit(inst); hfi_session_destroy(inst); - mutex_destroy(&inst->lock); v4l2_fh_del(&inst->fh); v4l2_fh_exit(&inst->fh); @@ -1092,12 +1084,14 @@ static int vdec_probe(struct platform_device *pdev) if (!vdev) return -ENOMEM; + mutex_init(&core->dec_lock); strlcpy(vdev->name, "qcom-venus-decoder", sizeof(vdev->name)); vdev->release = video_device_release; vdev->fops = &vdec_fops; vdev->ioctl_ops = &vdec_ioctl_ops; vdev->vfl_dir = VFL_DIR_M2M; vdev->v4l2_dev = &core->v4l2_dev; + vdev->lock = &core->dec_lock; vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); @@ -1123,6 +1117,7 @@ static int vdec_remove(struct platform_device *pdev) video_unregister_device(core->vdev_dec); pm_runtime_disable(core->dev_dec); + mutex_destroy(&core->dec_lock); return 0; } diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c index 6b2ce479584e..016af21abf5d 100644 --- a/drivers/media/platform/qcom/venus/venc.c +++ b/drivers/media/platform/qcom/venus/venc.c @@ -922,17 +922,13 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count) struct venus_inst *inst = vb2_get_drv_priv(q); int ret; - mutex_lock(&inst->lock); - if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) inst->streamon_out = 1; else inst->streamon_cap = 1; - if (!(inst->streamon_out & inst->streamon_cap)) { - mutex_unlock(&inst->lock); + if (!(inst->streamon_out & inst->streamon_cap)) return 0; - } venus_helper_init_instance(inst); @@ -960,8 +956,6 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count) if (ret) goto deinit_sess; - mutex_unlock(&inst->lock); - return 0; deinit_sess: @@ -972,7 +966,6 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count) inst->streamon_out = 0; else inst->streamon_cap = 0; - mutex_unlock(&inst->lock); return ret; } @@ -983,6 +976,8 @@ static const struct vb2_ops venc_vb2_ops = { .start_streaming = venc_start_streaming, .stop_streaming = venus_helper_vb2_stop_streaming, .buf_queue = venus_helper_vb2_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static void venc_buf_done(struct venus_inst *inst, unsigned int buf_type, @@ -1054,6 +1049,7 @@ static int m2m_queue_init(void *priv, struct vb2_queue *src_vq, src_vq->allow_zero_bytesused = 1; src_vq->min_buffers_needed = 1; src_vq->dev = inst->core->dev; + src_vq->lock = &inst->core->enc_lock; if (inst->core->res->hfi_version == HFI_VERSION_1XX) src_vq->bidirectional = 1; ret = vb2_queue_init(src_vq); @@ -1070,6 +1066,7 @@ static int m2m_queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->allow_zero_bytesused = 1; dst_vq->min_buffers_needed = 1; dst_vq->dev = inst->core->dev; + dst_vq->lock = &inst->core->enc_lock; ret = vb2_queue_init(dst_vq); if (ret) { vb2_queue_release(src_vq); @@ -1121,9 +1118,9 @@ static int venc_open(struct file *file) INIT_LIST_HEAD(&inst->registeredbufs); INIT_LIST_HEAD(&inst->internalbufs); INIT_LIST_HEAD(&inst->list); - mutex_init(&inst->lock); inst->core = core; + inst->lock = &core->enc_lock; inst->session_type = VIDC_SESSION_TYPE_ENC; venus_helper_init_instance(inst); @@ -1188,7 +1185,6 @@ static int venc_close(struct file *file) v4l2_m2m_release(inst->m2m_dev); venc_ctrl_deinit(inst); hfi_session_destroy(inst); - mutex_destroy(&inst->lock); v4l2_fh_del(&inst->fh); v4l2_fh_exit(&inst->fh); @@ -1237,11 +1233,13 @@ static int venc_probe(struct platform_device *pdev) return -ENOMEM; strlcpy(vdev->name, "qcom-venus-encoder", sizeof(vdev->name)); + mutex_init(&core->enc_lock); vdev->release = video_device_release; vdev->fops = &venc_fops; vdev->ioctl_ops = &venc_ioctl_ops; vdev->vfl_dir = VFL_DIR_M2M; vdev->v4l2_dev = &core->v4l2_dev; + vdev->lock = &core->enc_lock; vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); @@ -1267,6 +1265,7 @@ static int venc_remove(struct platform_device *pdev) video_unregister_device(core->vdev_enc); pm_runtime_disable(core->dev_enc); + mutex_destroy(&core->enc_lock); return 0; } -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 09/17] davinci_vpfe: Add video_device and vb2_queue locks 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (7 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 08/17] venus: Add video_device and vb2_queue locks Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 10/17] mx_emmaprp: Implement wait_prepare and wait_finish Ezequiel Garcia ` (8 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia 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> --- drivers/staging/media/davinci_vpfe/vpfe_video.c | 6 +++++- drivers/staging/media/davinci_vpfe/vpfe_video.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c b/drivers/staging/media/davinci_vpfe/vpfe_video.c index 390fc98d07dd..1269a983455e 100644 --- a/drivers/staging/media/davinci_vpfe/vpfe_video.c +++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c @@ -1312,6 +1312,8 @@ static const struct vb2_ops video_qops = { .stop_streaming = vpfe_stop_streaming, .buf_cleanup = vpfe_buf_cleanup, .buf_queue = vpfe_buffer_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; /* @@ -1357,6 +1359,7 @@ static int vpfe_reqbufs(struct file *file, void *priv, q->buf_struct_size = sizeof(struct vpfe_cap_buffer); q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; q->dev = vpfe_dev->pdev; + q->lock = &video->lock; ret = vb2_queue_init(q); if (ret) { @@ -1598,17 +1601,18 @@ int vpfe_video_init(struct vpfe_video_device *video, const char *name) return -EINVAL; } /* Initialize field of video device */ + mutex_init(&video->lock); video->video_dev.release = video_device_release; video->video_dev.fops = &vpfe_fops; video->video_dev.ioctl_ops = &vpfe_ioctl_ops; video->video_dev.minor = -1; video->video_dev.tvnorms = 0; + video->video_dev.lock = &video->lock; snprintf(video->video_dev.name, sizeof(video->video_dev.name), "DAVINCI VIDEO %s %s", name, direction); spin_lock_init(&video->irqlock); spin_lock_init(&video->dma_queue_lock); - mutex_init(&video->lock); ret = media_entity_pads_init(&video->video_dev.entity, 1, &video->pad); if (ret < 0) diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.h b/drivers/staging/media/davinci_vpfe/vpfe_video.h index 22136d3dadcb..4bbd219e8329 100644 --- a/drivers/staging/media/davinci_vpfe/vpfe_video.h +++ b/drivers/staging/media/davinci_vpfe/vpfe_video.h @@ -128,7 +128,7 @@ struct vpfe_video_device { spinlock_t irqlock; /* IRQ lock for DMA queue */ spinlock_t dma_queue_lock; - /* lock used to access this structure */ + /* lock used to serialize all video4linux ioctls */ struct mutex lock; /* number of users performing IO */ u32 io_usrs; -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 10/17] mx_emmaprp: Implement wait_prepare and wait_finish 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (8 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 09/17] davinci_vpfe: " Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 11/17] m2m-deinterlace: " Ezequiel Garcia ` (7 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia This driver is currently specifying a video_device lock, which means it is protecting all the ioctls (including queue ioctls) with a single mutex. It's therefore straightforward to implement wait_prepare and wait_finish, by explicitly setting the vb2_queue lock. Having these callbacks releases the queue lock while blocking, which improves latency by allowing for example streamoff or qbuf operations while waiting in dqbuf. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/mx2_emmaprp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c index 5a8eff60e95f..7f9b356e7cc7 100644 --- a/drivers/media/platform/mx2_emmaprp.c +++ b/drivers/media/platform/mx2_emmaprp.c @@ -747,6 +747,8 @@ static const struct vb2_ops emmaprp_qops = { .queue_setup = emmaprp_queue_setup, .buf_prepare = emmaprp_buf_prepare, .buf_queue = emmaprp_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, @@ -763,6 +765,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, src_vq->mem_ops = &vb2_dma_contig_memops; src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; src_vq->dev = ctx->dev->v4l2_dev.dev; + src_vq->lock = &ctx->dev->dev_mutex; ret = vb2_queue_init(src_vq); if (ret) @@ -776,6 +779,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->mem_ops = &vb2_dma_contig_memops; dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; dst_vq->dev = ctx->dev->v4l2_dev.dev; + dst_vq->lock = &ctx->dev->dev_mutex; return vb2_queue_init(dst_vq); } -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 11/17] m2m-deinterlace: Implement wait_prepare and wait_finish 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (9 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 10/17] mx_emmaprp: Implement wait_prepare and wait_finish Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 12/17] stk1160: Set the vb2_queue lock before calling vb2_queue_init Ezequiel Garcia ` (6 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia This driver is currently specifying a video_device lock, which means it is protecting all the ioctls (including queue ioctls) with a single mutex. It's therefore straightforward to implement wait_prepare and wait_finish, by explicitly setting the vb2_queue lock. Having these callbacks releases the queue lock while blocking, which improves latency by allowing for example streamoff or qbuf operations while waiting in dqbuf. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/platform/m2m-deinterlace.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/m2m-deinterlace.c b/drivers/media/platform/m2m-deinterlace.c index 1e4195144f39..94dd8ec0f265 100644 --- a/drivers/media/platform/m2m-deinterlace.c +++ b/drivers/media/platform/m2m-deinterlace.c @@ -856,6 +856,8 @@ static const struct vb2_ops deinterlace_qops = { .queue_setup = deinterlace_queue_setup, .buf_prepare = deinterlace_buf_prepare, .buf_queue = deinterlace_buf_queue, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, @@ -872,6 +874,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, src_vq->mem_ops = &vb2_dma_contig_memops; src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; src_vq->dev = ctx->dev->v4l2_dev.dev; + src_vq->lock = &ctx->dev->dev_mutex; q_data[V4L2_M2M_SRC].fmt = &formats[0]; q_data[V4L2_M2M_SRC].width = 640; q_data[V4L2_M2M_SRC].height = 480; @@ -890,6 +893,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->mem_ops = &vb2_dma_contig_memops; dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; dst_vq->dev = ctx->dev->v4l2_dev.dev; + dst_vq->lock = &ctx->dev->dev_mutex; q_data[V4L2_M2M_DST].fmt = &formats[0]; q_data[V4L2_M2M_DST].width = 640; q_data[V4L2_M2M_DST].height = 480; -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 12/17] stk1160: Set the vb2_queue lock before calling vb2_queue_init 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (10 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 11/17] m2m-deinterlace: " Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 13/17] dvb-core: Provide lock for vb2_queue Ezequiel Garcia ` (5 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia The vb2_queue will soon be mandatory. The videobuf2 core will throw a verbose warning if it's not set. The stk1160 driver is setting the queue lock, but after the vb2_queue_init call. Avoid the warning by setting the lock before the queue initialization. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/usb/stk1160/stk1160-v4l.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c index 77b759a0bcd9..504e413edcd2 100644 --- a/drivers/media/usb/stk1160/stk1160-v4l.c +++ b/drivers/media/usb/stk1160/stk1160-v4l.c @@ -802,6 +802,7 @@ int stk1160_vb2_setup(struct stk1160 *dev) q->buf_struct_size = sizeof(struct stk1160_buffer); q->ops = &stk1160_video_qops; q->mem_ops = &vb2_vmalloc_memops; + q->lock = &dev->vb_queue_lock; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; rc = vb2_queue_init(q); @@ -827,7 +828,6 @@ int stk1160_video_register(struct stk1160 *dev) * It will be used to protect *only* v4l2 ioctls. */ dev->vdev.lock = &dev->v4l_lock; - dev->vdev.queue->lock = &dev->vb_queue_lock; /* This will be used to set video_device parent */ dev->vdev.v4l2_dev = &dev->v4l2_dev; -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 13/17] dvb-core: Provide lock for vb2_queue 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (11 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 12/17] stk1160: Set the vb2_queue lock before calling vb2_queue_init Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 14/17] videobuf2-core: require q->lock Ezequiel Garcia ` (4 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia Use the vb2 context mutex to protect the vb2_queue. This allows to replace the ad-hoc wait_{prepare, finish} with vb2_ops_wait_{prepare, finish}. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- drivers/media/dvb-core/dvb_vb2.c | 22 +++------------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/drivers/media/dvb-core/dvb_vb2.c b/drivers/media/dvb-core/dvb_vb2.c index b811adf88afa..cd3ea44f0ae9 100644 --- a/drivers/media/dvb-core/dvb_vb2.c +++ b/drivers/media/dvb-core/dvb_vb2.c @@ -107,31 +107,14 @@ static void _stop_streaming(struct vb2_queue *vq) spin_unlock_irqrestore(&ctx->slock, flags); } -static void _dmxdev_lock(struct vb2_queue *vq) -{ - struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq); - - mutex_lock(&ctx->mutex); - dprintk(3, "[%s]\n", ctx->name); -} - -static void _dmxdev_unlock(struct vb2_queue *vq) -{ - struct dvb_vb2_ctx *ctx = vb2_get_drv_priv(vq); - - if (mutex_is_locked(&ctx->mutex)) - mutex_unlock(&ctx->mutex); - dprintk(3, "[%s]\n", ctx->name); -} - static const struct vb2_ops dvb_vb2_qops = { .queue_setup = _queue_setup, .buf_prepare = _buffer_prepare, .buf_queue = _buffer_queue, .start_streaming = _start_streaming, .stop_streaming = _stop_streaming, - .wait_prepare = _dmxdev_unlock, - .wait_finish = _dmxdev_lock, + .wait_prepare = vb2_ops_wait_prepare, + .wait_finish = vb2_ops_wait_finish, }; static void _fill_dmx_buffer(struct vb2_buffer *vb, void *pb) @@ -183,6 +166,7 @@ int dvb_vb2_init(struct dvb_vb2_ctx *ctx, const char *name, int nonblocking) q->mem_ops = &vb2_vmalloc_memops; q->buf_ops = &dvb_vb2_buf_ops; q->num_buffers = 0; + q->lock = &ctx->mutex; ret = vb2_core_queue_init(q); if (ret) { ctx->state = DVB_VB2_STATE_NONE; -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 14/17] videobuf2-core: require q->lock 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (12 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 13/17] dvb-core: Provide lock for vb2_queue Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 15/17] videobuf2: assume q->lock is always set Ezequiel Garcia ` (3 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Hans Verkuil From: Hans Verkuil <hansverk@cisco.com> Refuse to initialize a vb2 queue if there is no lock specified. Signed-off-by: Hans Verkuil <hansverk@cisco.com> --- drivers/media/common/videobuf2/videobuf2-core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c index f32ec7342ef0..0d8e93f9a622 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -2005,6 +2005,7 @@ int vb2_core_queue_init(struct vb2_queue *q) if (WARN_ON(!q) || WARN_ON(!q->ops) || WARN_ON(!q->mem_ops) || + WARN_ON(!q->lock) || WARN_ON(!q->type) || WARN_ON(!q->io_modes) || WARN_ON(!q->ops->queue_setup) || -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 15/17] videobuf2: assume q->lock is always set 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (13 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 14/17] videobuf2-core: require q->lock Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 16/17] v4l2-ioctl.c: assume queue->lock " Ezequiel Garcia ` (2 subsequent siblings) 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Hans Verkuil From: Hans Verkuil <hansverk@cisco.com> Drop checks for q->lock. Drop calls to wait_finish/prepare, just lock/unlock q->lock. Signed-off-by: Hans Verkuil <hansverk@cisco.com> --- .../media/common/videobuf2/videobuf2-core.c | 21 ++++++--------- .../media/common/videobuf2/videobuf2-v4l2.c | 27 +++++-------------- include/media/videobuf2-core.h | 2 -- 3 files changed, 15 insertions(+), 35 deletions(-) diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c index 0d8e93f9a622..e0c4e1a8f311 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -462,8 +462,7 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) * counters to the kernel log. */ if (q->num_buffers) { - bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming || - q->cnt_wait_prepare != q->cnt_wait_finish; + bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming; if (unbalanced || debug) { pr_info("counters for queue %p:%s\n", q, @@ -471,12 +470,8 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) pr_info(" setup: %u start_streaming: %u stop_streaming: %u\n", q->cnt_queue_setup, q->cnt_start_streaming, q->cnt_stop_streaming); - pr_info(" wait_prepare: %u wait_finish: %u\n", - q->cnt_wait_prepare, q->cnt_wait_finish); } q->cnt_queue_setup = 0; - q->cnt_wait_prepare = 0; - q->cnt_wait_finish = 0; q->cnt_start_streaming = 0; q->cnt_stop_streaming = 0; } @@ -1487,10 +1482,10 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) /* * We are streaming and blocking, wait for another buffer to - * become ready or for streamoff. Driver's lock is released to + * become ready or for streamoff. The queue's lock is released to * allow streamoff or qbuf to be called while waiting. */ - call_void_qop(q, wait_prepare, q); + mutex_unlock(q->lock); /* * All locks have been released, it is safe to sleep now. @@ -1504,7 +1499,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) * We need to reevaluate both conditions again after reacquiring * the locks or return an error if one occurred. */ - call_void_qop(q, wait_finish, q); + mutex_lock(q->lock); if (ret) { dprintk(1, "sleep was interrupted\n"); return ret; @@ -2531,10 +2526,10 @@ static int vb2_thread(void *data) vb = q->bufs[index++]; prequeue--; } else { - call_void_qop(q, wait_finish, q); + mutex_lock(q->lock); if (!threadio->stop) ret = vb2_core_dqbuf(q, &index, NULL, 0); - call_void_qop(q, wait_prepare, q); + mutex_unlock(q->lock); dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); if (!ret) vb = q->bufs[index]; @@ -2546,12 +2541,12 @@ static int vb2_thread(void *data) if (vb->state != VB2_BUF_STATE_ERROR) if (threadio->fnc(vb, threadio->priv)) break; - call_void_qop(q, wait_finish, q); + mutex_lock(q->lock); if (copy_timestamp) vb->timestamp = ktime_get_ns(); if (!threadio->stop) ret = vb2_core_qbuf(q, vb->index, NULL); - call_void_qop(q, wait_prepare, q); + mutex_unlock(q->lock); if (ret || threadio->stop) break; } diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c index 886a2d8d5c6c..7d2172468f72 100644 --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c @@ -852,9 +852,8 @@ EXPORT_SYMBOL_GPL(_vb2_fop_release); int vb2_fop_release(struct file *file) { struct video_device *vdev = video_devdata(file); - struct mutex *lock = vdev->queue->lock ? vdev->queue->lock : vdev->lock; - return _vb2_fop_release(file, lock); + return _vb2_fop_release(file, vdev->queue->lock); } EXPORT_SYMBOL_GPL(vb2_fop_release); @@ -862,12 +861,11 @@ ssize_t vb2_fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct video_device *vdev = video_devdata(file); - struct mutex *lock = vdev->queue->lock ? vdev->queue->lock : vdev->lock; int err = -EBUSY; if (!(vdev->queue->io_modes & VB2_WRITE)) return -EINVAL; - if (lock && mutex_lock_interruptible(lock)) + if (mutex_lock_interruptible(vdev->queue->lock)) return -ERESTARTSYS; if (vb2_queue_is_busy(vdev, file)) goto exit; @@ -876,8 +874,7 @@ ssize_t vb2_fop_write(struct file *file, const char __user *buf, if (vdev->queue->fileio) vdev->queue->owner = file->private_data; exit: - if (lock) - mutex_unlock(lock); + mutex_unlock(vdev->queue->lock); return err; } EXPORT_SYMBOL_GPL(vb2_fop_write); @@ -886,12 +883,11 @@ ssize_t vb2_fop_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct video_device *vdev = video_devdata(file); - struct mutex *lock = vdev->queue->lock ? vdev->queue->lock : vdev->lock; int err = -EBUSY; if (!(vdev->queue->io_modes & VB2_READ)) return -EINVAL; - if (lock && mutex_lock_interruptible(lock)) + if (mutex_lock_interruptible(vdev->queue->lock)) return -ERESTARTSYS; if (vb2_queue_is_busy(vdev, file)) goto exit; @@ -900,8 +896,7 @@ ssize_t vb2_fop_read(struct file *file, char __user *buf, if (vdev->queue->fileio) vdev->queue->owner = file->private_data; exit: - if (lock) - mutex_unlock(lock); + mutex_unlock(vdev->queue->lock); return err; } EXPORT_SYMBOL_GPL(vb2_fop_read); @@ -910,17 +905,10 @@ __poll_t vb2_fop_poll(struct file *file, poll_table *wait) { struct video_device *vdev = video_devdata(file); struct vb2_queue *q = vdev->queue; - struct mutex *lock = q->lock ? q->lock : vdev->lock; __poll_t res; void *fileio; - /* - * If this helper doesn't know how to lock, then you shouldn't be using - * it but you should write your own. - */ - WARN_ON(!lock); - - if (lock && mutex_lock_interruptible(lock)) + if (mutex_lock_interruptible(q->lock)) return EPOLLERR; fileio = q->fileio; @@ -930,8 +918,7 @@ __poll_t vb2_fop_poll(struct file *file, poll_table *wait) /* If fileio was started, then we have a new queue owner. */ if (!fileio && q->fileio) q->owner = file->private_data; - if (lock) - mutex_unlock(lock); + mutex_unlock(q->lock); return res; } EXPORT_SYMBOL_GPL(vb2_fop_poll); diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index f6818f732f34..d4e557b4f820 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -565,8 +565,6 @@ struct vb2_queue { * called. Used to check for unbalanced ops. */ u32 cnt_queue_setup; - u32 cnt_wait_prepare; - u32 cnt_wait_finish; u32 cnt_start_streaming; u32 cnt_stop_streaming; #endif -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 16/17] v4l2-ioctl.c: assume queue->lock is always set 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (14 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 15/17] videobuf2: assume q->lock is always set Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-15 19:07 ` [PATCH v4 17/17] media: Remove wait_{prepare, finish} Ezequiel Garcia 2018-06-29 18:12 ` [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Hans Verkuil From: Hans Verkuil <hansverk@cisco.com> vb2_queue now expects a valid lock pointer, so drop the checks for that in v4l2-ioctl.c. Signed-off-by: Hans Verkuil <hansverk@cisco.com> --- drivers/media/v4l2-core/v4l2-ioctl.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index db835578e21f..c3da0f9a86e4 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -2715,12 +2715,11 @@ static struct mutex *v4l2_ioctl_get_lock(struct video_device *vdev, struct v4l2_m2m_queue_ctx *ctx = is_output ? &vfh->m2m_ctx->out_q_ctx : &vfh->m2m_ctx->cap_q_ctx; - if (ctx->q.lock) - return ctx->q.lock; + return ctx->q.lock; } #endif - if (vdev->queue && vdev->queue->lock && - (v4l2_ioctls[_IOC_NR(cmd)].flags & INFO_FL_QUEUE)) + if (vdev->queue && + (v4l2_ioctls[_IOC_NR(cmd)].flags & INFO_FL_QUEUE)) return vdev->queue->lock; return vdev->lock; } -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH v4 17/17] media: Remove wait_{prepare, finish} 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (15 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 16/17] v4l2-ioctl.c: assume queue->lock " Ezequiel Garcia @ 2018-06-15 19:07 ` Ezequiel Garcia 2018-06-29 18:12 ` [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-15 19:07 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel, Ezequiel Garcia Now that all drivers provide a proper vb2_queue lock, and that wait_{prepare, finish} are no longer in use, get rid of them. Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> --- Documentation/media/kapi/v4l2-dev.rst | 7 +++---- drivers/input/rmi4/rmi_f54.c | 2 -- drivers/input/touchscreen/atmel_mxt_ts.c | 2 -- drivers/input/touchscreen/sur40.c | 2 -- .../media/common/videobuf2/videobuf2-v4l2.c | 14 -------------- drivers/media/dvb-core/dvb_vb2.c | 2 -- drivers/media/dvb-frontends/rtl2832_sdr.c | 2 -- drivers/media/i2c/video-i2c.c | 2 -- drivers/media/pci/cobalt/cobalt-v4l2.c | 2 -- drivers/media/pci/cx23885/cx23885-417.c | 2 -- drivers/media/pci/cx23885/cx23885-dvb.c | 2 -- drivers/media/pci/cx23885/cx23885-vbi.c | 2 -- drivers/media/pci/cx23885/cx23885-video.c | 2 -- drivers/media/pci/cx25821/cx25821-video.c | 2 -- drivers/media/pci/cx88/cx88-blackbird.c | 2 -- drivers/media/pci/cx88/cx88-dvb.c | 2 -- drivers/media/pci/cx88/cx88-vbi.c | 2 -- drivers/media/pci/cx88/cx88-video.c | 2 -- drivers/media/pci/dt3155/dt3155.c | 2 -- drivers/media/pci/intel/ipu3/ipu3-cio2.c | 2 -- drivers/media/pci/saa7134/saa7134-empress.c | 2 -- drivers/media/pci/saa7134/saa7134-ts.c | 2 -- drivers/media/pci/saa7134/saa7134-vbi.c | 2 -- drivers/media/pci/saa7134/saa7134-video.c | 2 -- drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c | 2 -- drivers/media/pci/solo6x10/solo6x10-v4l2.c | 2 -- drivers/media/pci/sta2x11/sta2x11_vip.c | 2 -- drivers/media/pci/tw5864/tw5864-video.c | 2 -- drivers/media/pci/tw68/tw68-video.c | 2 -- drivers/media/pci/tw686x/tw686x-video.c | 2 -- drivers/media/platform/am437x/am437x-vpfe.c | 2 -- drivers/media/platform/atmel/atmel-isc.c | 2 -- drivers/media/platform/atmel/atmel-isi.c | 2 -- drivers/media/platform/coda/coda-common.c | 2 -- drivers/media/platform/davinci/vpbe_display.c | 2 -- drivers/media/platform/davinci/vpif_capture.c | 2 -- drivers/media/platform/davinci/vpif_display.c | 2 -- drivers/media/platform/exynos-gsc/gsc-m2m.c | 2 -- .../media/platform/exynos4-is/fimc-capture.c | 2 -- .../media/platform/exynos4-is/fimc-isp-video.c | 2 -- drivers/media/platform/exynos4-is/fimc-lite.c | 2 -- drivers/media/platform/exynos4-is/fimc-m2m.c | 2 -- drivers/media/platform/m2m-deinterlace.c | 2 -- .../media/platform/marvell-ccic/mcam-core.c | 4 ---- .../media/platform/mtk-jpeg/mtk_jpeg_core.c | 2 -- drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 2 -- .../media/platform/mtk-vcodec/mtk_vcodec_dec.c | 2 -- .../media/platform/mtk-vcodec/mtk_vcodec_enc.c | 2 -- drivers/media/platform/mx2_emmaprp.c | 2 -- drivers/media/platform/omap3isp/ispvideo.c | 2 -- drivers/media/platform/pxa_camera.c | 2 -- .../platform/qcom/camss-8x16/camss-video.c | 2 -- drivers/media/platform/qcom/venus/vdec.c | 2 -- drivers/media/platform/qcom/venus/venc.c | 2 -- drivers/media/platform/rcar-vin/rcar-dma.c | 2 -- drivers/media/platform/rcar_drif.c | 2 -- drivers/media/platform/rcar_fdp1.c | 2 -- drivers/media/platform/rcar_jpu.c | 2 -- drivers/media/platform/renesas-ceu.c | 2 -- drivers/media/platform/rockchip/rga/rga-buf.c | 2 -- .../media/platform/s3c-camif/camif-capture.c | 2 -- drivers/media/platform/s5p-g2d/g2d.c | 2 -- drivers/media/platform/s5p-jpeg/jpeg-core.c | 2 -- drivers/media/platform/s5p-mfc/s5p_mfc_dec.c | 2 -- drivers/media/platform/s5p-mfc/s5p_mfc_enc.c | 2 -- drivers/media/platform/sh_veu.c | 2 -- drivers/media/platform/sh_vou.c | 2 -- .../platform/soc_camera/sh_mobile_ceu_camera.c | 2 -- drivers/media/platform/sti/bdisp/bdisp-v4l2.c | 2 -- drivers/media/platform/sti/delta/delta-v4l2.c | 4 ---- drivers/media/platform/sti/hva/hva-v4l2.c | 2 -- drivers/media/platform/stm32/stm32-dcmi.c | 2 -- drivers/media/platform/ti-vpe/cal.c | 2 -- drivers/media/platform/ti-vpe/vpe.c | 2 -- drivers/media/platform/vim2m.c | 2 -- drivers/media/platform/vimc/vimc-capture.c | 6 ------ drivers/media/platform/vivid/vivid-sdr-cap.c | 2 -- drivers/media/platform/vivid/vivid-vbi-cap.c | 2 -- drivers/media/platform/vivid/vivid-vbi-out.c | 2 -- drivers/media/platform/vivid/vivid-vid-cap.c | 2 -- drivers/media/platform/vivid/vivid-vid-out.c | 2 -- drivers/media/platform/vsp1/vsp1_histo.c | 2 -- drivers/media/platform/vsp1/vsp1_video.c | 2 -- drivers/media/platform/xilinx/xilinx-dma.c | 2 -- drivers/media/usb/airspy/airspy.c | 2 -- drivers/media/usb/au0828/au0828-vbi.c | 2 -- drivers/media/usb/au0828/au0828-video.c | 2 -- drivers/media/usb/em28xx/em28xx-vbi.c | 2 -- drivers/media/usb/em28xx/em28xx-video.c | 2 -- drivers/media/usb/go7007/go7007-v4l2.c | 2 -- drivers/media/usb/gspca/gspca.c | 2 -- drivers/media/usb/hackrf/hackrf.c | 2 -- drivers/media/usb/msi2500/msi2500.c | 2 -- drivers/media/usb/pwc/pwc-if.c | 2 -- drivers/media/usb/s2255/s2255drv.c | 2 -- drivers/media/usb/stk1160/stk1160-v4l.c | 2 -- drivers/media/usb/usbtv/usbtv-video.c | 2 -- drivers/media/usb/uvc/uvc_queue.c | 4 ---- .../staging/media/davinci_vpfe/vpfe_video.c | 2 -- drivers/staging/media/imx/imx-media-capture.c | 2 -- .../bcm2835-camera/bcm2835-camera.c | 2 -- drivers/usb/gadget/function/uvc_queue.c | 2 -- include/media/videobuf2-v4l2.h | 18 ------------------ samples/v4l/v4l2-pci-skeleton.c | 7 ------- 104 files changed, 3 insertions(+), 253 deletions(-) diff --git a/Documentation/media/kapi/v4l2-dev.rst b/Documentation/media/kapi/v4l2-dev.rst index eb03ccc41c41..ec25531308d3 100644 --- a/Documentation/media/kapi/v4l2-dev.rst +++ b/Documentation/media/kapi/v4l2-dev.rst @@ -163,10 +163,9 @@ waits in the code, then you should do the same to allow other processes to access the device node while the first process is waiting for something. -In the case of :ref:`videobuf2 <vb2_framework>` you will need to implement the -``wait_prepare()`` and ``wait_finish()`` callbacks to unlock/lock if applicable. -If you use the ``queue->lock`` pointer, then you can use the helper functions -:c:func:`vb2_ops_wait_prepare` and :c:func:`vb2_ops_wait_finish`. +In the case of :ref:`videobuf2 <vb2_framework>` you are required to define a +``queue->lock`` mutex, which is used to protect all the queue-specific +ioctls. The implementation of a hotplug disconnect should also take the lock from :c:type:`video_device` before calling v4l2_device_disconnect. If you are also diff --git a/drivers/input/rmi4/rmi_f54.c b/drivers/input/rmi4/rmi_f54.c index 98a935efec8e..3f88e9f4610f 100644 --- a/drivers/input/rmi4/rmi_f54.c +++ b/drivers/input/rmi4/rmi_f54.c @@ -355,8 +355,6 @@ static void rmi_f54_buffer_queue(struct vb2_buffer *vb) static const struct vb2_ops rmi_f54_queue_ops = { .queue_setup = rmi_f54_queue_setup, .buf_queue = rmi_f54_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct vb2_queue rmi_f54_queue = { diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 54fe190fd4bc..499664ff754f 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -2368,8 +2368,6 @@ static void mxt_buffer_queue(struct vb2_buffer *vb) static const struct vb2_ops mxt_queue_ops = { .queue_setup = mxt_queue_setup, .buf_queue = mxt_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct vb2_queue mxt_queue = { diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c index 894843a7ec7b..8b22b742fff2 100644 --- a/drivers/input/touchscreen/sur40.c +++ b/drivers/input/touchscreen/sur40.c @@ -1102,8 +1102,6 @@ static const struct vb2_ops sur40_queue_ops = { .buf_queue = sur40_buffer_queue, .start_streaming = sur40_start_streaming, .stop_streaming = sur40_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct vb2_queue sur40_queue = { diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c index 7d2172468f72..d0d87483e5c3 100644 --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c @@ -934,20 +934,6 @@ unsigned long vb2_fop_get_unmapped_area(struct file *file, unsigned long addr, EXPORT_SYMBOL_GPL(vb2_fop_get_unmapped_area); #endif -/* vb2_ops helpers. Only use if vq->lock is non-NULL. */ - -void vb2_ops_wait_prepare(struct vb2_queue *vq) -{ - mutex_unlock(vq->lock); -} -EXPORT_SYMBOL_GPL(vb2_ops_wait_prepare); - -void vb2_ops_wait_finish(struct vb2_queue *vq) -{ - mutex_lock(vq->lock); -} -EXPORT_SYMBOL_GPL(vb2_ops_wait_finish); - MODULE_DESCRIPTION("Driver helper framework for Video for Linux 2"); MODULE_AUTHOR("Pawel Osciak <pawel@osciak.com>, Marek Szyprowski"); MODULE_LICENSE("GPL"); diff --git a/drivers/media/dvb-core/dvb_vb2.c b/drivers/media/dvb-core/dvb_vb2.c index cd3ea44f0ae9..b2bb238459c9 100644 --- a/drivers/media/dvb-core/dvb_vb2.c +++ b/drivers/media/dvb-core/dvb_vb2.c @@ -113,8 +113,6 @@ static const struct vb2_ops dvb_vb2_qops = { .buf_queue = _buffer_queue, .start_streaming = _start_streaming, .stop_streaming = _stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static void _fill_dmx_buffer(struct vb2_buffer *vb, void *pb) diff --git a/drivers/media/dvb-frontends/rtl2832_sdr.c b/drivers/media/dvb-frontends/rtl2832_sdr.c index c6e78d870ccd..b1836c7f3581 100644 --- a/drivers/media/dvb-frontends/rtl2832_sdr.c +++ b/drivers/media/dvb-frontends/rtl2832_sdr.c @@ -962,8 +962,6 @@ static const struct vb2_ops rtl2832_sdr_vb2_ops = { .buf_queue = rtl2832_sdr_buf_queue, .start_streaming = rtl2832_sdr_start_streaming, .stop_streaming = rtl2832_sdr_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int rtl2832_sdr_g_tuner(struct file *file, void *priv, diff --git a/drivers/media/i2c/video-i2c.c b/drivers/media/i2c/video-i2c.c index 0b347cc19aa5..a6fb7cc9219c 100644 --- a/drivers/media/i2c/video-i2c.c +++ b/drivers/media/i2c/video-i2c.c @@ -269,8 +269,6 @@ static struct vb2_ops video_i2c_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int video_i2c_querycap(struct file *file, void *priv, diff --git a/drivers/media/pci/cobalt/cobalt-v4l2.c b/drivers/media/pci/cobalt/cobalt-v4l2.c index e2a4c705d353..9415ae2ee694 100644 --- a/drivers/media/pci/cobalt/cobalt-v4l2.c +++ b/drivers/media/pci/cobalt/cobalt-v4l2.c @@ -428,8 +428,6 @@ static const struct vb2_ops cobalt_qops = { .buf_queue = cobalt_buf_queue, .start_streaming = cobalt_start_streaming, .stop_streaming = cobalt_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* V4L2 ioctls */ diff --git a/drivers/media/pci/cx23885/cx23885-417.c b/drivers/media/pci/cx23885/cx23885-417.c index a71f3c7569ce..84fff69e6df3 100644 --- a/drivers/media/pci/cx23885/cx23885-417.c +++ b/drivers/media/pci/cx23885/cx23885-417.c @@ -1219,8 +1219,6 @@ static const struct vb2_ops cx23885_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = cx23885_start_streaming, .stop_streaming = cx23885_stop_streaming, }; diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c index 7d52173073d6..e8f4c4150a0b 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c @@ -180,8 +180,6 @@ static const struct vb2_ops dvb_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = cx23885_start_streaming, .stop_streaming = cx23885_stop_streaming, }; diff --git a/drivers/media/pci/cx23885/cx23885-vbi.c b/drivers/media/pci/cx23885/cx23885-vbi.c index 70f9f13bded3..cb766f042cb9 100644 --- a/drivers/media/pci/cx23885/cx23885-vbi.c +++ b/drivers/media/pci/cx23885/cx23885-vbi.c @@ -259,8 +259,6 @@ const struct vb2_ops cx23885_vbi_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = cx23885_start_streaming, .stop_streaming = cx23885_stop_streaming, }; diff --git a/drivers/media/pci/cx23885/cx23885-video.c b/drivers/media/pci/cx23885/cx23885-video.c index f8a3deadc77a..4401ed1c81c4 100644 --- a/drivers/media/pci/cx23885/cx23885-video.c +++ b/drivers/media/pci/cx23885/cx23885-video.c @@ -525,8 +525,6 @@ static const struct vb2_ops cx23885_video_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = cx23885_start_streaming, .stop_streaming = cx23885_stop_streaming, }; diff --git a/drivers/media/pci/cx25821/cx25821-video.c b/drivers/media/pci/cx25821/cx25821-video.c index dbaf42ec26cd..0256043487d8 100644 --- a/drivers/media/pci/cx25821/cx25821-video.c +++ b/drivers/media/pci/cx25821/cx25821-video.c @@ -308,8 +308,6 @@ static const struct vb2_ops cx25821_video_qops = { .buf_prepare = cx25821_buffer_prepare, .buf_finish = cx25821_buffer_finish, .buf_queue = cx25821_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = cx25821_start_streaming, .stop_streaming = cx25821_stop_streaming, }; diff --git a/drivers/media/pci/cx88/cx88-blackbird.c b/drivers/media/pci/cx88/cx88-blackbird.c index 7a4876cf9f08..0ccffecd0b51 100644 --- a/drivers/media/pci/cx88/cx88-blackbird.c +++ b/drivers/media/pci/cx88/cx88-blackbird.c @@ -789,8 +789,6 @@ static const struct vb2_ops blackbird_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/pci/cx88/cx88-dvb.c b/drivers/media/pci/cx88/cx88-dvb.c index ccfde28d4af2..b27587d119b6 100644 --- a/drivers/media/pci/cx88/cx88-dvb.c +++ b/drivers/media/pci/cx88/cx88-dvb.c @@ -160,8 +160,6 @@ static const struct vb2_ops dvb_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/pci/cx88/cx88-vbi.c b/drivers/media/pci/cx88/cx88-vbi.c index 58489ea0c1da..635fb719fa99 100644 --- a/drivers/media/pci/cx88/cx88-vbi.c +++ b/drivers/media/pci/cx88/cx88-vbi.c @@ -228,8 +228,6 @@ const struct vb2_ops cx8800_vbi_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c index 7b113bad70d2..a6acbeeb69c8 100644 --- a/drivers/media/pci/cx88/cx88-video.c +++ b/drivers/media/pci/cx88/cx88-video.c @@ -581,8 +581,6 @@ static const struct vb2_ops cx8800_video_qops = { .buf_prepare = buffer_prepare, .buf_finish = buffer_finish, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/pci/dt3155/dt3155.c b/drivers/media/pci/dt3155/dt3155.c index 1775c36891ae..cf2666d754b2 100644 --- a/drivers/media/pci/dt3155/dt3155.c +++ b/drivers/media/pci/dt3155/dt3155.c @@ -235,8 +235,6 @@ static void dt3155_buf_queue(struct vb2_buffer *vb) static const struct vb2_ops q_ops = { .queue_setup = dt3155_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_prepare = dt3155_buf_prepare, .start_streaming = dt3155_start_streaming, .stop_streaming = dt3155_stop_streaming, diff --git a/drivers/media/pci/intel/ipu3/ipu3-cio2.c b/drivers/media/pci/intel/ipu3/ipu3-cio2.c index 29027159eced..3fc3cbf2e2af 100644 --- a/drivers/media/pci/intel/ipu3/ipu3-cio2.c +++ b/drivers/media/pci/intel/ipu3/ipu3-cio2.c @@ -1055,8 +1055,6 @@ static const struct vb2_ops cio2_vb2_ops = { .queue_setup = cio2_vb2_queue_setup, .start_streaming = cio2_vb2_start_streaming, .stop_streaming = cio2_vb2_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /**************** V4L2 interface ****************/ diff --git a/drivers/media/pci/saa7134/saa7134-empress.c b/drivers/media/pci/saa7134/saa7134-empress.c index 66acfd35ffc6..f01096a22b59 100644 --- a/drivers/media/pci/saa7134/saa7134-empress.c +++ b/drivers/media/pci/saa7134/saa7134-empress.c @@ -86,8 +86,6 @@ static const struct vb2_ops saa7134_empress_qops = { .buf_init = saa7134_ts_buffer_init, .buf_prepare = saa7134_ts_buffer_prepare, .buf_queue = saa7134_vb2_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/pci/saa7134/saa7134-ts.c b/drivers/media/pci/saa7134/saa7134-ts.c index 2be703617e29..bcf66d1b8ba0 100644 --- a/drivers/media/pci/saa7134/saa7134-ts.c +++ b/drivers/media/pci/saa7134/saa7134-ts.c @@ -175,8 +175,6 @@ struct vb2_ops saa7134_ts_qops = { .buf_init = saa7134_ts_buffer_init, .buf_prepare = saa7134_ts_buffer_prepare, .buf_queue = saa7134_vb2_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = saa7134_ts_stop_streaming, }; EXPORT_SYMBOL_GPL(saa7134_ts_qops); diff --git a/drivers/media/pci/saa7134/saa7134-vbi.c b/drivers/media/pci/saa7134/saa7134-vbi.c index 57bea543c39b..f8e17370265b 100644 --- a/drivers/media/pci/saa7134/saa7134-vbi.c +++ b/drivers/media/pci/saa7134/saa7134-vbi.c @@ -170,8 +170,6 @@ const struct vb2_ops saa7134_vbi_qops = { .buf_init = buffer_init, .buf_prepare = buffer_prepare, .buf_queue = saa7134_vb2_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = saa7134_vb2_start_streaming, .stop_streaming = saa7134_vb2_stop_streaming, }; diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c index 1a50ec9d084f..57da6a1d5b4c 100644 --- a/drivers/media/pci/saa7134/saa7134-video.c +++ b/drivers/media/pci/saa7134/saa7134-video.c @@ -1055,8 +1055,6 @@ static const struct vb2_ops vb2_qops = { .buf_init = buffer_init, .buf_prepare = buffer_prepare, .buf_queue = saa7134_vb2_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = saa7134_vb2_start_streaming, .stop_streaming = saa7134_vb2_stop_streaming, }; diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c index 25f9f2ebff1d..e7f01d29092b 100644 --- a/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c +++ b/drivers/media/pci/solo6x10/solo6x10-v4l2-enc.c @@ -765,8 +765,6 @@ static const struct vb2_ops solo_enc_video_qops = { .buf_finish = solo_enc_buf_finish, .start_streaming = solo_enc_start_streaming, .stop_streaming = solo_enc_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int solo_enc_querycap(struct file *file, void *priv, diff --git a/drivers/media/pci/solo6x10/solo6x10-v4l2.c b/drivers/media/pci/solo6x10/solo6x10-v4l2.c index 99ffd1ed4a73..7c172d793b1b 100644 --- a/drivers/media/pci/solo6x10/solo6x10-v4l2.c +++ b/drivers/media/pci/solo6x10/solo6x10-v4l2.c @@ -374,8 +374,6 @@ static const struct vb2_ops solo_video_qops = { .buf_queue = solo_buf_queue, .start_streaming = solo_start_streaming, .stop_streaming = solo_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int solo_querycap(struct file *file, void *priv, diff --git a/drivers/media/pci/sta2x11/sta2x11_vip.c b/drivers/media/pci/sta2x11/sta2x11_vip.c index da2b2a2292d0..c5ddff6f6458 100644 --- a/drivers/media/pci/sta2x11/sta2x11_vip.c +++ b/drivers/media/pci/sta2x11/sta2x11_vip.c @@ -386,8 +386,6 @@ static const struct vb2_ops vip_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; diff --git a/drivers/media/pci/tw5864/tw5864-video.c b/drivers/media/pci/tw5864/tw5864-video.c index ff2b7da90c08..49de5db67783 100644 --- a/drivers/media/pci/tw5864/tw5864-video.c +++ b/drivers/media/pci/tw5864/tw5864-video.c @@ -479,8 +479,6 @@ static const struct vb2_ops tw5864_video_qops = { .buf_queue = tw5864_buf_queue, .start_streaming = tw5864_start_streaming, .stop_streaming = tw5864_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int tw5864_s_ctrl(struct v4l2_ctrl *ctrl) diff --git a/drivers/media/pci/tw68/tw68-video.c b/drivers/media/pci/tw68/tw68-video.c index 8c1f4a049764..2841604d0514 100644 --- a/drivers/media/pci/tw68/tw68-video.c +++ b/drivers/media/pci/tw68/tw68-video.c @@ -540,8 +540,6 @@ static const struct vb2_ops tw68_video_qops = { .buf_finish = tw68_buf_finish, .start_streaming = tw68_start_streaming, .stop_streaming = tw68_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* ------------------------------------------------------------------ */ diff --git a/drivers/media/pci/tw686x/tw686x-video.c b/drivers/media/pci/tw686x/tw686x-video.c index 0ea8dd44026c..ed5730ab1d72 100644 --- a/drivers/media/pci/tw686x/tw686x-video.c +++ b/drivers/media/pci/tw686x/tw686x-video.c @@ -583,8 +583,6 @@ static const struct vb2_ops tw686x_video_qops = { .buf_prepare = tw686x_buf_prepare, .start_streaming = tw686x_start_streaming, .stop_streaming = tw686x_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int tw686x_s_ctrl(struct v4l2_ctrl *ctrl) diff --git a/drivers/media/platform/am437x/am437x-vpfe.c b/drivers/media/platform/am437x/am437x-vpfe.c index 58ebc2220d0e..a3926348baea 100644 --- a/drivers/media/platform/am437x/am437x-vpfe.c +++ b/drivers/media/platform/am437x/am437x-vpfe.c @@ -2230,8 +2230,6 @@ static long vpfe_ioctl_default(struct file *file, void *priv, } static const struct vb2_ops vpfe_video_qops = { - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .queue_setup = vpfe_queue_setup, .buf_prepare = vpfe_buffer_prepare, .buf_queue = vpfe_buffer_queue, diff --git a/drivers/media/platform/atmel/atmel-isc.c b/drivers/media/platform/atmel/atmel-isc.c index d89e14524d42..be5aec085de0 100644 --- a/drivers/media/platform/atmel/atmel-isc.c +++ b/drivers/media/platform/atmel/atmel-isc.c @@ -1225,8 +1225,6 @@ static void isc_buffer_queue(struct vb2_buffer *vb) static const struct vb2_ops isc_vb2_ops = { .queue_setup = isc_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_prepare = isc_buffer_prepare, .start_streaming = isc_start_streaming, .stop_streaming = isc_stop_streaming, diff --git a/drivers/media/platform/atmel/atmel-isi.c b/drivers/media/platform/atmel/atmel-isi.c index e5be21a31640..a6febaf7634b 100644 --- a/drivers/media/platform/atmel/atmel-isi.c +++ b/drivers/media/platform/atmel/atmel-isi.c @@ -527,8 +527,6 @@ static const struct vb2_ops isi_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int isi_g_fmt_vid_cap(struct file *file, void *priv, diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c index c7631e117dd3..08f618cc4cbe 100644 --- a/drivers/media/platform/coda/coda-common.c +++ b/drivers/media/platform/coda/coda-common.c @@ -1664,8 +1664,6 @@ static const struct vb2_ops coda_qops = { .buf_queue = coda_buf_queue, .start_streaming = coda_start_streaming, .stop_streaming = coda_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int coda_s_ctrl(struct v4l2_ctrl *ctrl) diff --git a/drivers/media/platform/davinci/vpbe_display.c b/drivers/media/platform/davinci/vpbe_display.c index b0eb3d899eb4..974d735e5bb2 100644 --- a/drivers/media/platform/davinci/vpbe_display.c +++ b/drivers/media/platform/davinci/vpbe_display.c @@ -360,8 +360,6 @@ static void vpbe_stop_streaming(struct vb2_queue *vq) static const struct vb2_ops video_qops = { .queue_setup = vpbe_buffer_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_prepare = vpbe_buffer_prepare, .start_streaming = vpbe_start_streaming, .stop_streaming = vpbe_stop_streaming, diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c index 9364cdf62f54..e29e39de036b 100644 --- a/drivers/media/platform/davinci/vpif_capture.c +++ b/drivers/media/platform/davinci/vpif_capture.c @@ -318,8 +318,6 @@ static const struct vb2_ops video_qops = { .start_streaming = vpif_start_streaming, .stop_streaming = vpif_stop_streaming, .buf_queue = vpif_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /** diff --git a/drivers/media/platform/davinci/vpif_display.c b/drivers/media/platform/davinci/vpif_display.c index 7be636237acf..2aa32d31922e 100644 --- a/drivers/media/platform/davinci/vpif_display.c +++ b/drivers/media/platform/davinci/vpif_display.c @@ -292,8 +292,6 @@ static void vpif_stop_streaming(struct vb2_queue *vq) static const struct vb2_ops video_qops = { .queue_setup = vpif_buffer_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_prepare = vpif_buffer_prepare, .start_streaming = vpif_start_streaming, .stop_streaming = vpif_stop_streaming, diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c index e9ff27949a91..673fb3710abd 100644 --- a/drivers/media/platform/exynos-gsc/gsc-m2m.c +++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c @@ -282,8 +282,6 @@ static const struct vb2_ops gsc_m2m_qops = { .queue_setup = gsc_m2m_queue_setup, .buf_prepare = gsc_m2m_buf_prepare, .buf_queue = gsc_m2m_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = gsc_m2m_stop_streaming, .start_streaming = gsc_m2m_start_streaming, }; diff --git a/drivers/media/platform/exynos4-is/fimc-capture.c b/drivers/media/platform/exynos4-is/fimc-capture.c index a3cdac188190..8b0aa1eca9cb 100644 --- a/drivers/media/platform/exynos4-is/fimc-capture.c +++ b/drivers/media/platform/exynos4-is/fimc-capture.c @@ -457,8 +457,6 @@ static const struct vb2_ops fimc_capture_qops = { .queue_setup = queue_setup, .buf_prepare = buffer_prepare, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c index 55ba696b8cf4..570c29d7f1a2 100644 --- a/drivers/media/platform/exynos4-is/fimc-isp-video.c +++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c @@ -258,8 +258,6 @@ static const struct vb2_ops isp_video_capture_qops = { .queue_setup = isp_video_capture_queue_setup, .buf_prepare = isp_video_capture_buffer_prepare, .buf_queue = isp_video_capture_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = isp_video_capture_start_streaming, .stop_streaming = isp_video_capture_stop_streaming, }; diff --git a/drivers/media/platform/exynos4-is/fimc-lite.c b/drivers/media/platform/exynos4-is/fimc-lite.c index 70d5f5586a5d..b00f36e93118 100644 --- a/drivers/media/platform/exynos4-is/fimc-lite.c +++ b/drivers/media/platform/exynos4-is/fimc-lite.c @@ -450,8 +450,6 @@ static const struct vb2_ops fimc_lite_qops = { .queue_setup = queue_setup, .buf_prepare = buffer_prepare, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/platform/exynos4-is/fimc-m2m.c b/drivers/media/platform/exynos4-is/fimc-m2m.c index a19f8b164a47..cc0289be3e18 100644 --- a/drivers/media/platform/exynos4-is/fimc-m2m.c +++ b/drivers/media/platform/exynos4-is/fimc-m2m.c @@ -223,8 +223,6 @@ static const struct vb2_ops fimc_qops = { .queue_setup = fimc_queue_setup, .buf_prepare = fimc_buf_prepare, .buf_queue = fimc_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = stop_streaming, .start_streaming = start_streaming, }; diff --git a/drivers/media/platform/m2m-deinterlace.c b/drivers/media/platform/m2m-deinterlace.c index 94dd8ec0f265..c264e4c92980 100644 --- a/drivers/media/platform/m2m-deinterlace.c +++ b/drivers/media/platform/m2m-deinterlace.c @@ -856,8 +856,6 @@ static const struct vb2_ops deinterlace_qops = { .queue_setup = deinterlace_queue_setup, .buf_prepare = deinterlace_buf_prepare, .buf_queue = deinterlace_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c index dfdbd4354b74..5932e417d0c9 100644 --- a/drivers/media/platform/marvell-ccic/mcam-core.c +++ b/drivers/media/platform/marvell-ccic/mcam-core.c @@ -1178,8 +1178,6 @@ static const struct vb2_ops mcam_vb2_ops = { .buf_queue = mcam_vb_buf_queue, .start_streaming = mcam_vb_start_streaming, .stop_streaming = mcam_vb_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; @@ -1242,8 +1240,6 @@ static const struct vb2_ops mcam_vb2_sg_ops = { .buf_cleanup = mcam_vb_sg_buf_cleanup, .start_streaming = mcam_vb_start_streaming, .stop_streaming = mcam_vb_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; #endif /* MCAM_MODE_DMA_SG */ diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c index 328e8f650d9b..948a02ef88f4 100644 --- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c +++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c @@ -760,8 +760,6 @@ static const struct vb2_ops mtk_jpeg_qops = { .queue_setup = mtk_jpeg_queue_setup, .buf_prepare = mtk_jpeg_buf_prepare, .buf_queue = mtk_jpeg_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = mtk_jpeg_start_streaming, .stop_streaming = mtk_jpeg_stop_streaming, }; diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c index c2e2f5f1ebf1..4bee830b1071 100644 --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c @@ -613,8 +613,6 @@ static const struct vb2_ops mtk_mdp_m2m_qops = { .buf_queue = mtk_mdp_m2m_buf_queue, .stop_streaming = mtk_mdp_m2m_stop_streaming, .start_streaming = mtk_mdp_m2m_start_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int mtk_mdp_m2m_querycap(struct file *file, void *fh, diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c index 86f0a7134365..c7e709dff7dd 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec.c @@ -1439,8 +1439,6 @@ static const struct vb2_ops mtk_vdec_vb2_ops = { .queue_setup = vb2ops_vdec_queue_setup, .buf_prepare = vb2ops_vdec_buf_prepare, .buf_queue = vb2ops_vdec_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_init = vb2ops_vdec_buf_init, .buf_finish = vb2ops_vdec_buf_finish, .start_streaming = vb2ops_vdec_start_streaming, diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c index 1b1a28abbf1f..fe1b908161cd 100644 --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c @@ -927,8 +927,6 @@ static const struct vb2_ops mtk_venc_vb2_ops = { .queue_setup = vb2ops_venc_queue_setup, .buf_prepare = vb2ops_venc_buf_prepare, .buf_queue = vb2ops_venc_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = vb2ops_venc_start_streaming, .stop_streaming = vb2ops_venc_stop_streaming, }; diff --git a/drivers/media/platform/mx2_emmaprp.c b/drivers/media/platform/mx2_emmaprp.c index 7f9b356e7cc7..ce029cfdfe52 100644 --- a/drivers/media/platform/mx2_emmaprp.c +++ b/drivers/media/platform/mx2_emmaprp.c @@ -747,8 +747,6 @@ static const struct vb2_ops emmaprp_qops = { .queue_setup = emmaprp_queue_setup, .buf_prepare = emmaprp_buf_prepare, .buf_queue = emmaprp_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index f835aeb9ddc5..5f13b6b465fc 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -496,8 +496,6 @@ static const struct vb2_ops isp_video_queue_ops = { .buf_prepare = isp_video_buffer_prepare, .buf_queue = isp_video_buffer_queue, .start_streaming = isp_video_start_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* diff --git a/drivers/media/platform/pxa_camera.c b/drivers/media/platform/pxa_camera.c index 4d5a26b4cdda..4ee02c2afdea 100644 --- a/drivers/media/platform/pxa_camera.c +++ b/drivers/media/platform/pxa_camera.c @@ -1570,8 +1570,6 @@ static const struct vb2_ops pxac_vb2_ops = { .buf_cleanup = pxac_vb2_cleanup, .start_streaming = pxac_vb2_start_streaming, .stop_streaming = pxac_vb2_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int pxa_camera_init_videobuf2(struct pxa_camera_dev *pcdev) diff --git a/drivers/media/platform/qcom/camss-8x16/camss-video.c b/drivers/media/platform/qcom/camss-8x16/camss-video.c index ffaa2849e0c1..4b40fa7b10bd 100644 --- a/drivers/media/platform/qcom/camss-8x16/camss-video.c +++ b/drivers/media/platform/qcom/camss-8x16/camss-video.c @@ -417,8 +417,6 @@ static void video_stop_streaming(struct vb2_queue *q) static const struct vb2_ops msm_video_vb2_q_ops = { .queue_setup = video_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_init = video_buf_init, .buf_prepare = video_buf_prepare, .buf_queue = video_buf_queue, diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c index 41d14df46f5d..be1bd9b44138 100644 --- a/drivers/media/platform/qcom/venus/vdec.c +++ b/drivers/media/platform/qcom/venus/vdec.c @@ -783,8 +783,6 @@ static const struct vb2_ops vdec_vb2_ops = { .start_streaming = vdec_start_streaming, .stop_streaming = venus_helper_vb2_stop_streaming, .buf_queue = venus_helper_vb2_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static void vdec_buf_done(struct venus_inst *inst, unsigned int buf_type, diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c index 016af21abf5d..2084d3055160 100644 --- a/drivers/media/platform/qcom/venus/venc.c +++ b/drivers/media/platform/qcom/venus/venc.c @@ -976,8 +976,6 @@ static const struct vb2_ops venc_vb2_ops = { .start_streaming = venc_start_streaming, .stop_streaming = venus_helper_vb2_stop_streaming, .buf_queue = venus_helper_vb2_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static void venc_buf_done(struct venus_inst *inst, unsigned int buf_type, diff --git a/drivers/media/platform/rcar-vin/rcar-dma.c b/drivers/media/platform/rcar-vin/rcar-dma.c index ac07f99e3516..d7d23620158d 100644 --- a/drivers/media/platform/rcar-vin/rcar-dma.c +++ b/drivers/media/platform/rcar-vin/rcar-dma.c @@ -1219,8 +1219,6 @@ static const struct vb2_ops rvin_qops = { .buf_queue = rvin_buffer_queue, .start_streaming = rvin_start_streaming, .stop_streaming = rvin_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; void rvin_dma_unregister(struct rvin_dev *vin) diff --git a/drivers/media/platform/rcar_drif.c b/drivers/media/platform/rcar_drif.c index dc7e280c91b4..fb719613a171 100644 --- a/drivers/media/platform/rcar_drif.c +++ b/drivers/media/platform/rcar_drif.c @@ -865,8 +865,6 @@ static const struct vb2_ops rcar_drif_vb2_ops = { .buf_queue = rcar_drif_buf_queue, .start_streaming = rcar_drif_start_streaming, .stop_streaming = rcar_drif_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int rcar_drif_querycap(struct file *file, void *fh, diff --git a/drivers/media/platform/rcar_fdp1.c b/drivers/media/platform/rcar_fdp1.c index b13dec3081e5..d2585e6b6364 100644 --- a/drivers/media/platform/rcar_fdp1.c +++ b/drivers/media/platform/rcar_fdp1.c @@ -2038,8 +2038,6 @@ static const struct vb2_ops fdp1_qops = { .buf_queue = fdp1_buf_queue, .start_streaming = fdp1_start_streaming, .stop_streaming = fdp1_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/rcar_jpu.c b/drivers/media/platform/rcar_jpu.c index 8b44a849ab41..2ff194f70ed1 100644 --- a/drivers/media/platform/rcar_jpu.c +++ b/drivers/media/platform/rcar_jpu.c @@ -1190,8 +1190,6 @@ static const struct vb2_ops jpu_qops = { .buf_finish = jpu_buf_finish, .start_streaming = jpu_start_streaming, .stop_streaming = jpu_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int jpu_queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/renesas-ceu.c b/drivers/media/platform/renesas-ceu.c index fe4fe944592d..bf6bbeaceca6 100644 --- a/drivers/media/platform/renesas-ceu.c +++ b/drivers/media/platform/renesas-ceu.c @@ -753,8 +753,6 @@ static const struct vb2_ops ceu_vb2_ops = { .queue_setup = ceu_vb2_setup, .buf_queue = ceu_vb2_queue, .buf_prepare = ceu_vb2_prepare, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = ceu_start_streaming, .stop_streaming = ceu_stop_streaming, }; diff --git a/drivers/media/platform/rockchip/rga/rga-buf.c b/drivers/media/platform/rockchip/rga/rga-buf.c index fa1ba98c96dc..09b4c877021d 100644 --- a/drivers/media/platform/rockchip/rga/rga-buf.c +++ b/drivers/media/platform/rockchip/rga/rga-buf.c @@ -108,8 +108,6 @@ const struct vb2_ops rga_qops = { .queue_setup = rga_queue_setup, .buf_prepare = rga_buf_prepare, .buf_queue = rga_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = rga_buf_start_streaming, .stop_streaming = rga_buf_stop_streaming, }; diff --git a/drivers/media/platform/s3c-camif/camif-capture.c b/drivers/media/platform/s3c-camif/camif-capture.c index 9ab8e7ee2e1e..ec767a650a59 100644 --- a/drivers/media/platform/s3c-camif/camif-capture.c +++ b/drivers/media/platform/s3c-camif/camif-capture.c @@ -526,8 +526,6 @@ static const struct vb2_ops s3c_camif_qops = { .queue_setup = queue_setup, .buf_prepare = buffer_prepare, .buf_queue = buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = start_streaming, .stop_streaming = stop_streaming, }; diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c index ce4280730835..66aa8cf1d048 100644 --- a/drivers/media/platform/s5p-g2d/g2d.c +++ b/drivers/media/platform/s5p-g2d/g2d.c @@ -142,8 +142,6 @@ static const struct vb2_ops g2d_qops = { .queue_setup = g2d_queue_setup, .buf_prepare = g2d_buf_prepare, .buf_queue = g2d_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c index 79b63da27f53..69f85dc09366 100644 --- a/drivers/media/platform/s5p-jpeg/jpeg-core.c +++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c @@ -2644,8 +2644,6 @@ static const struct vb2_ops s5p_jpeg_qops = { .queue_setup = s5p_jpeg_queue_setup, .buf_prepare = s5p_jpeg_buf_prepare, .buf_queue = s5p_jpeg_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = s5p_jpeg_start_streaming, .stop_streaming = s5p_jpeg_stop_streaming, }; diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c index 6a3cc4f86c5d..e872b71bb52d 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_dec.c @@ -1099,8 +1099,6 @@ static void s5p_mfc_buf_queue(struct vb2_buffer *vb) static struct vb2_ops s5p_mfc_dec_qops = { .queue_setup = s5p_mfc_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_init = s5p_mfc_buf_init, .start_streaming = s5p_mfc_start_streaming, .stop_streaming = s5p_mfc_stop_streaming, diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c index 570f391f2cfd..0b4dae3cc87d 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_enc.c @@ -2606,8 +2606,6 @@ static void s5p_mfc_buf_queue(struct vb2_buffer *vb) static struct vb2_ops s5p_mfc_enc_qops = { .queue_setup = s5p_mfc_queue_setup, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .buf_init = s5p_mfc_buf_init, .buf_prepare = s5p_mfc_buf_prepare, .start_streaming = s5p_mfc_start_streaming, diff --git a/drivers/media/platform/sh_veu.c b/drivers/media/platform/sh_veu.c index 1a0cde017fdf..3dd550523033 100644 --- a/drivers/media/platform/sh_veu.c +++ b/drivers/media/platform/sh_veu.c @@ -925,8 +925,6 @@ static const struct vb2_ops sh_veu_qops = { .queue_setup = sh_veu_queue_setup, .buf_prepare = sh_veu_buf_prepare, .buf_queue = sh_veu_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int sh_veu_queue_init(void *priv, struct vb2_queue *src_vq, diff --git a/drivers/media/platform/sh_vou.c b/drivers/media/platform/sh_vou.c index 4dccf29e9d78..9da2c121a03a 100644 --- a/drivers/media/platform/sh_vou.c +++ b/drivers/media/platform/sh_vou.c @@ -369,8 +369,6 @@ static const struct vb2_ops sh_vou_qops = { .buf_queue = sh_vou_buf_queue, .start_streaming = sh_vou_start_streaming, .stop_streaming = sh_vou_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* Video IOCTLs */ diff --git a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c index 242342fd7ede..ec7db9cfefaa 100644 --- a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c +++ b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c @@ -475,8 +475,6 @@ static const struct vb2_ops sh_mobile_ceu_videobuf_ops = { .buf_queue = sh_mobile_ceu_videobuf_queue, .buf_cleanup = sh_mobile_ceu_videobuf_release, .buf_init = sh_mobile_ceu_videobuf_init, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = sh_mobile_ceu_stop_streaming, }; diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c index 66b64096f5de..6e3bdae5ed2f 100644 --- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c +++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c @@ -531,8 +531,6 @@ static const struct vb2_ops bdisp_qops = { .queue_setup = bdisp_queue_setup, .buf_prepare = bdisp_buf_prepare, .buf_queue = bdisp_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = bdisp_stop_streaming, .start_streaming = bdisp_start_streaming, }; diff --git a/drivers/media/platform/sti/delta/delta-v4l2.c b/drivers/media/platform/sti/delta/delta-v4l2.c index 232d508c5b66..a2686aef3296 100644 --- a/drivers/media/platform/sti/delta/delta-v4l2.c +++ b/drivers/media/platform/sti/delta/delta-v4l2.c @@ -1578,8 +1578,6 @@ static const struct vb2_ops delta_vb2_au_ops = { .queue_setup = delta_vb2_au_queue_setup, .buf_prepare = delta_vb2_au_prepare, .buf_queue = delta_vb2_au_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = delta_vb2_au_start_streaming, .stop_streaming = delta_vb2_au_stop_streaming, }; @@ -1589,8 +1587,6 @@ static const struct vb2_ops delta_vb2_frame_ops = { .buf_prepare = delta_vb2_frame_prepare, .buf_finish = delta_vb2_frame_finish, .buf_queue = delta_vb2_frame_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = delta_vb2_frame_stop_streaming, }; diff --git a/drivers/media/platform/sti/hva/hva-v4l2.c b/drivers/media/platform/sti/hva/hva-v4l2.c index 15080cb00fa7..69e1514a8c34 100644 --- a/drivers/media/platform/sti/hva/hva-v4l2.c +++ b/drivers/media/platform/sti/hva/hva-v4l2.c @@ -1114,8 +1114,6 @@ static const struct vb2_ops hva_qops = { .buf_queue = hva_buf_queue, .start_streaming = hva_start_streaming, .stop_streaming = hva_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c index 2e1933d872ee..f9909d7a8704 100644 --- a/drivers/media/platform/stm32/stm32-dcmi.c +++ b/drivers/media/platform/stm32/stm32-dcmi.c @@ -767,8 +767,6 @@ static const struct vb2_ops dcmi_video_qops = { .buf_queue = dcmi_buf_queue, .start_streaming = dcmi_start_streaming, .stop_streaming = dcmi_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int dcmi_g_fmt_vid_cap(struct file *file, void *priv, diff --git a/drivers/media/platform/ti-vpe/cal.c b/drivers/media/platform/ti-vpe/cal.c index d1febe5baa6d..13656060fcdb 100644 --- a/drivers/media/platform/ti-vpe/cal.c +++ b/drivers/media/platform/ti-vpe/cal.c @@ -1379,8 +1379,6 @@ static const struct vb2_ops cal_video_qops = { .buf_queue = cal_buffer_queue, .start_streaming = cal_start_streaming, .stop_streaming = cal_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct v4l2_file_operations cal_fops = { diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c index e395aa85c8ad..abe12bbe1f90 100644 --- a/drivers/media/platform/ti-vpe/vpe.c +++ b/drivers/media/platform/ti-vpe/vpe.c @@ -2198,8 +2198,6 @@ static const struct vb2_ops vpe_qops = { .queue_setup = vpe_queue_setup, .buf_prepare = vpe_buf_prepare, .buf_queue = vpe_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = vpe_start_streaming, .stop_streaming = vpe_stop_streaming, }; diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c index 065483e62db4..e64489c8106c 100644 --- a/drivers/media/platform/vim2m.c +++ b/drivers/media/platform/vim2m.c @@ -821,8 +821,6 @@ static const struct vb2_ops vim2m_qops = { .buf_queue = vim2m_buf_queue, .start_streaming = vim2m_start_streaming, .stop_streaming = vim2m_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq) diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c index 88a1e5670c72..cd889c50b248 100644 --- a/drivers/media/platform/vimc/vimc-capture.c +++ b/drivers/media/platform/vimc/vimc-capture.c @@ -328,12 +328,6 @@ static const struct vb2_ops vimc_cap_qops = { .buf_queue = vimc_cap_buf_queue, .queue_setup = vimc_cap_queue_setup, .buf_prepare = vimc_cap_buffer_prepare, - /* - * Since q->lock is set we can use the standard - * vb2_ops_wait_prepare/finish helper functions. - */ - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct media_entity_operations vimc_cap_mops = { diff --git a/drivers/media/platform/vivid/vivid-sdr-cap.c b/drivers/media/platform/vivid/vivid-sdr-cap.c index cfb7cb4d37a8..053a3e036b33 100644 --- a/drivers/media/platform/vivid/vivid-sdr-cap.c +++ b/drivers/media/platform/vivid/vivid-sdr-cap.c @@ -309,8 +309,6 @@ const struct vb2_ops vivid_sdr_cap_qops = { .buf_queue = sdr_cap_buf_queue, .start_streaming = sdr_cap_start_streaming, .stop_streaming = sdr_cap_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; int vivid_sdr_enum_freq_bands(struct file *file, void *fh, diff --git a/drivers/media/platform/vivid/vivid-vbi-cap.c b/drivers/media/platform/vivid/vivid-vbi-cap.c index 92a852955173..d1d04e7316e6 100644 --- a/drivers/media/platform/vivid/vivid-vbi-cap.c +++ b/drivers/media/platform/vivid/vivid-vbi-cap.c @@ -226,8 +226,6 @@ const struct vb2_ops vivid_vbi_cap_qops = { .buf_queue = vbi_cap_buf_queue, .start_streaming = vbi_cap_start_streaming, .stop_streaming = vbi_cap_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; int vidioc_g_fmt_vbi_cap(struct file *file, void *priv, diff --git a/drivers/media/platform/vivid/vivid-vbi-out.c b/drivers/media/platform/vivid/vivid-vbi-out.c index 69486c130a7e..98b5a966faff 100644 --- a/drivers/media/platform/vivid/vivid-vbi-out.c +++ b/drivers/media/platform/vivid/vivid-vbi-out.c @@ -121,8 +121,6 @@ const struct vb2_ops vivid_vbi_out_qops = { .buf_queue = vbi_out_buf_queue, .start_streaming = vbi_out_start_streaming, .stop_streaming = vbi_out_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; int vidioc_g_fmt_vbi_out(struct file *file, void *priv, diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c b/drivers/media/platform/vivid/vivid-vid-cap.c index 1599159f2574..2dba4bcad5c8 100644 --- a/drivers/media/platform/vivid/vivid-vid-cap.c +++ b/drivers/media/platform/vivid/vivid-vid-cap.c @@ -264,8 +264,6 @@ const struct vb2_ops vivid_vid_cap_qops = { .buf_queue = vid_cap_buf_queue, .start_streaming = vid_cap_start_streaming, .stop_streaming = vid_cap_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* diff --git a/drivers/media/platform/vivid/vivid-vid-out.c b/drivers/media/platform/vivid/vivid-vid-out.c index 51fec66d8d45..f7c6112fb89c 100644 --- a/drivers/media/platform/vivid/vivid-vid-out.c +++ b/drivers/media/platform/vivid/vivid-vid-out.c @@ -185,8 +185,6 @@ const struct vb2_ops vivid_vid_out_qops = { .buf_queue = vid_out_buf_queue, .start_streaming = vid_out_start_streaming, .stop_streaming = vid_out_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* diff --git a/drivers/media/platform/vsp1/vsp1_histo.c b/drivers/media/platform/vsp1/vsp1_histo.c index 5e15c8ff88d9..7a9c574c6c4a 100644 --- a/drivers/media/platform/vsp1/vsp1_histo.c +++ b/drivers/media/platform/vsp1/vsp1_histo.c @@ -159,8 +159,6 @@ static const struct vb2_ops histo_video_queue_qops = { .queue_setup = histo_queue_setup, .buf_prepare = histo_buffer_prepare, .buf_queue = histo_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = histo_start_streaming, .stop_streaming = histo_stop_streaming, }; diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c index 81d47a09d7bc..85903e46c1ab 100644 --- a/drivers/media/platform/vsp1/vsp1_video.c +++ b/drivers/media/platform/vsp1/vsp1_video.c @@ -949,8 +949,6 @@ static const struct vb2_ops vsp1_video_queue_qops = { .queue_setup = vsp1_video_queue_setup, .buf_prepare = vsp1_video_buffer_prepare, .buf_queue = vsp1_video_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = vsp1_video_start_streaming, .stop_streaming = vsp1_video_stop_streaming, }; diff --git a/drivers/media/platform/xilinx/xilinx-dma.c b/drivers/media/platform/xilinx/xilinx-dma.c index d041f94be832..1666412d9ff8 100644 --- a/drivers/media/platform/xilinx/xilinx-dma.c +++ b/drivers/media/platform/xilinx/xilinx-dma.c @@ -478,8 +478,6 @@ static const struct vb2_ops xvip_dma_queue_qops = { .queue_setup = xvip_dma_queue_setup, .buf_prepare = xvip_dma_buffer_prepare, .buf_queue = xvip_dma_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = xvip_dma_start_streaming, .stop_streaming = xvip_dma_stop_streaming, }; diff --git a/drivers/media/usb/airspy/airspy.c b/drivers/media/usb/airspy/airspy.c index e70c9e2f3798..97f01db5dcbb 100644 --- a/drivers/media/usb/airspy/airspy.c +++ b/drivers/media/usb/airspy/airspy.c @@ -610,8 +610,6 @@ static const struct vb2_ops airspy_vb2_ops = { .buf_queue = airspy_buf_queue, .start_streaming = airspy_start_streaming, .stop_streaming = airspy_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int airspy_querycap(struct file *file, void *fh, diff --git a/drivers/media/usb/au0828/au0828-vbi.c b/drivers/media/usb/au0828/au0828-vbi.c index 9dd6bdb7304f..e09fcbcea290 100644 --- a/drivers/media/usb/au0828/au0828-vbi.c +++ b/drivers/media/usb/au0828/au0828-vbi.c @@ -85,6 +85,4 @@ const struct vb2_ops au0828_vbi_qops = { .buf_queue = vbi_buffer_queue, .start_streaming = au0828_start_analog_streaming, .stop_streaming = au0828_stop_vbi_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; diff --git a/drivers/media/usb/au0828/au0828-video.c b/drivers/media/usb/au0828/au0828-video.c index 964cd7bcdd2c..f4469efaaa63 100644 --- a/drivers/media/usb/au0828/au0828-video.c +++ b/drivers/media/usb/au0828/au0828-video.c @@ -921,8 +921,6 @@ static const struct vb2_ops au0828_video_qops = { .buf_queue = buffer_queue, .start_streaming = au0828_start_analog_streaming, .stop_streaming = au0828_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* ------------------------------------------------------------------ diff --git a/drivers/media/usb/em28xx/em28xx-vbi.c b/drivers/media/usb/em28xx/em28xx-vbi.c index 63c48361d3f2..847ae9627bd0 100644 --- a/drivers/media/usb/em28xx/em28xx-vbi.c +++ b/drivers/media/usb/em28xx/em28xx-vbi.c @@ -94,6 +94,4 @@ const struct vb2_ops em28xx_vbi_qops = { .buf_queue = vbi_buffer_queue, .start_streaming = em28xx_start_analog_streaming, .stop_streaming = em28xx_stop_vbi_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index 68571bf36d28..9b588daaf646 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c @@ -1244,8 +1244,6 @@ static const struct vb2_ops em28xx_video_qops = { .buf_queue = buffer_queue, .start_streaming = em28xx_start_analog_streaming, .stop_streaming = em28xx_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int em28xx_vb2_setup(struct em28xx *dev) diff --git a/drivers/media/usb/go7007/go7007-v4l2.c b/drivers/media/usb/go7007/go7007-v4l2.c index c55c82f70e54..21d32838f54e 100644 --- a/drivers/media/usb/go7007/go7007-v4l2.c +++ b/drivers/media/usb/go7007/go7007-v4l2.c @@ -484,8 +484,6 @@ static const struct vb2_ops go7007_video_qops = { .buf_finish = go7007_buf_finish, .start_streaming = go7007_start_streaming, .stop_streaming = go7007_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int vidioc_g_parm(struct file *filp, void *priv, diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c index 57aa521e16b1..f823dba94580 100644 --- a/drivers/media/usb/gspca/gspca.c +++ b/drivers/media/usb/gspca/gspca.c @@ -1385,8 +1385,6 @@ static const struct vb2_ops gspca_qops = { .buf_queue = gspca_buffer_queue, .start_streaming = gspca_start_streaming, .stop_streaming = gspca_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct v4l2_file_operations dev_fops = { diff --git a/drivers/media/usb/hackrf/hackrf.c b/drivers/media/usb/hackrf/hackrf.c index 6d692fb3e8dd..1125da75f4dc 100644 --- a/drivers/media/usb/hackrf/hackrf.c +++ b/drivers/media/usb/hackrf/hackrf.c @@ -896,8 +896,6 @@ static const struct vb2_ops hackrf_vb2_ops = { .buf_queue = hackrf_buf_queue, .start_streaming = hackrf_start_streaming, .stop_streaming = hackrf_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int hackrf_querycap(struct file *file, void *fh, diff --git a/drivers/media/usb/msi2500/msi2500.c b/drivers/media/usb/msi2500/msi2500.c index 65ef755adfdc..9bf2e6dad624 100644 --- a/drivers/media/usb/msi2500/msi2500.c +++ b/drivers/media/usb/msi2500/msi2500.c @@ -902,8 +902,6 @@ static const struct vb2_ops msi2500_vb2_ops = { .buf_queue = msi2500_buf_queue, .start_streaming = msi2500_start_streaming, .stop_streaming = msi2500_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int msi2500_enum_fmt_sdr_cap(struct file *file, void *priv, diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c index 54b036d39c5b..6d9be76a3380 100644 --- a/drivers/media/usb/pwc/pwc-if.c +++ b/drivers/media/usb/pwc/pwc-if.c @@ -717,8 +717,6 @@ static const struct vb2_ops pwc_vb_queue_ops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /***************************************************************************/ diff --git a/drivers/media/usb/s2255/s2255drv.c b/drivers/media/usb/s2255/s2255drv.c index 82927eb334c4..52f5ef3fb431 100644 --- a/drivers/media/usb/s2255/s2255drv.c +++ b/drivers/media/usb/s2255/s2255drv.c @@ -720,8 +720,6 @@ static const struct vb2_ops s2255_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int vidioc_querycap(struct file *file, void *priv, diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c index 504e413edcd2..eb010c88205e 100644 --- a/drivers/media/usb/stk1160/stk1160-v4l.c +++ b/drivers/media/usb/stk1160/stk1160-v4l.c @@ -747,8 +747,6 @@ static const struct vb2_ops stk1160_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static const struct video_device v4l_template = { diff --git a/drivers/media/usb/usbtv/usbtv-video.c b/drivers/media/usb/usbtv/usbtv-video.c index ce79df643c7e..c2f8e50228ac 100644 --- a/drivers/media/usb/usbtv/usbtv-video.c +++ b/drivers/media/usb/usbtv/usbtv-video.c @@ -781,8 +781,6 @@ static const struct vb2_ops usbtv_vb2_ops = { .buf_queue = usbtv_buf_queue, .start_streaming = usbtv_start_streaming, .stop_streaming = usbtv_stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; static int usbtv_s_ctrl(struct v4l2_ctrl *ctrl) diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c index fecccb5e7628..c6a14f7af4e2 100644 --- a/drivers/media/usb/uvc/uvc_queue.c +++ b/drivers/media/usb/uvc/uvc_queue.c @@ -203,8 +203,6 @@ static const struct vb2_ops uvc_queue_qops = { .buf_prepare = uvc_buffer_prepare, .buf_queue = uvc_buffer_queue, .buf_finish = uvc_buffer_finish, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = uvc_start_streaming, .stop_streaming = uvc_stop_streaming, }; @@ -213,8 +211,6 @@ static const struct vb2_ops uvc_meta_queue_qops = { .queue_setup = uvc_queue_setup, .buf_prepare = uvc_buffer_prepare, .buf_queue = uvc_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .stop_streaming = uvc_stop_streaming, }; diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c b/drivers/staging/media/davinci_vpfe/vpfe_video.c index 1269a983455e..3b470e40988f 100644 --- a/drivers/staging/media/davinci_vpfe/vpfe_video.c +++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c @@ -1312,8 +1312,6 @@ static const struct vb2_ops video_qops = { .stop_streaming = vpfe_stop_streaming, .buf_cleanup = vpfe_buf_cleanup, .buf_queue = vpfe_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c index 4e3fdf8aeef5..d66a1f4236b3 100644 --- a/drivers/staging/media/imx/imx-media-capture.c +++ b/drivers/staging/media/imx/imx-media-capture.c @@ -503,8 +503,6 @@ static const struct vb2_ops capture_qops = { .buf_init = capture_buf_init, .buf_prepare = capture_buf_prepare, .buf_queue = capture_buf_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, .start_streaming = capture_start_streaming, .stop_streaming = capture_stop_streaming, }; diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c index 6dd0c838db05..b549ff154b03 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -636,8 +636,6 @@ static const struct vb2_ops bm2835_mmal_video_qops = { .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* ------------------------------------------------------------------ diff --git a/drivers/usb/gadget/function/uvc_queue.c b/drivers/usb/gadget/function/uvc_queue.c index 9e33d5206d54..f1090107d0ec 100644 --- a/drivers/usb/gadget/function/uvc_queue.c +++ b/drivers/usb/gadget/function/uvc_queue.c @@ -106,8 +106,6 @@ static struct vb2_ops uvc_queue_qops = { .queue_setup = uvc_queue_setup, .buf_prepare = uvc_buffer_prepare, .buf_queue = uvc_buffer_queue, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; int uvcg_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type, diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h index 3d5e2d739f05..cf83b01dc44e 100644 --- a/include/media/videobuf2-v4l2.h +++ b/include/media/videobuf2-v4l2.h @@ -273,22 +273,4 @@ unsigned long vb2_fop_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags); #endif -/** - * vb2_ops_wait_prepare - helper function to lock a struct &vb2_queue - * - * @vq: pointer to &struct vb2_queue - * - * ..note:: only use if vq->lock is non-NULL. - */ -void vb2_ops_wait_prepare(struct vb2_queue *vq); - -/** - * vb2_ops_wait_finish - helper function to unlock a struct &vb2_queue - * - * @vq: pointer to &struct vb2_queue - * - * ..note:: only use if vq->lock is non-NULL. - */ -void vb2_ops_wait_finish(struct vb2_queue *vq); - #endif /* _MEDIA_VIDEOBUF2_V4L2_H */ diff --git a/samples/v4l/v4l2-pci-skeleton.c b/samples/v4l/v4l2-pci-skeleton.c index f520e3aef9c6..74f9c817c8bd 100644 --- a/samples/v4l/v4l2-pci-skeleton.c +++ b/samples/v4l/v4l2-pci-skeleton.c @@ -277,19 +277,12 @@ static void stop_streaming(struct vb2_queue *vq) return_all_buffers(skel, VB2_BUF_STATE_ERROR); } -/* - * The vb2 queue ops. Note that since q->lock is set we can use the standard - * vb2_ops_wait_prepare/finish helper functions. If q->lock would be NULL, - * then this driver would have to provide these ops. - */ static const struct vb2_ops skel_qops = { .queue_setup = queue_setup, .buf_prepare = buffer_prepare, .buf_queue = buffer_queue, .start_streaming = start_streaming, .stop_streaming = stop_streaming, - .wait_prepare = vb2_ops_wait_prepare, - .wait_finish = vb2_ops_wait_finish, }; /* -- 2.17.1 ^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler 2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia ` (16 preceding siblings ...) 2018-06-15 19:07 ` [PATCH v4 17/17] media: Remove wait_{prepare, finish} Ezequiel Garcia @ 2018-06-29 18:12 ` Ezequiel Garcia 17 siblings, 0 replies; 28+ messages in thread From: Ezequiel Garcia @ 2018-06-29 18:12 UTC (permalink / raw) To: linux-media; +Cc: Hans Verkuil, kernel On Fri, 2018-06-15 at 16:07 -0300, Ezequiel Garcia wrote: > Fourth spin of the series posted by Hans: > > https://www.mail-archive.com/linux-media@vger.kernel.org/msg131363.ht > ml > > There aren't any changes from v3, aside from rebasing > and re-ordering the patches as requested by Hans. > > See v3 cover letter for more details. > > Series was tested with tw686x, gspca sonixj and UVC devices. > Build tested with the 0-day kbuild test robot. > > AFAIK, nothing is preventing this series. Hans, is there any other feedback? Thanks, Ezequiel ^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2018-07-06 15:24 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-06-15 19:07 [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 01/17] v4l2-ioctl.c: use correct vb2_queue lock for m2m devices Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 02/17] sta2x11: Add video_device and vb2_queue locks Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 03/17] omap4iss: Add vb2_queue lock Ezequiel Garcia
2018-07-02 8:28 ` Hans Verkuil
2018-07-06 15:24 ` Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 04/17] omap3isp: " Ezequiel Garcia
2018-06-18 7:31 ` Hans Verkuil
2018-06-20 17:42 ` [PATCH v5 " Ezequiel Garcia
2018-06-21 8:18 ` Hans Verkuil
2018-06-22 3:51 ` Ezequiel Garcia
2018-06-22 3:53 ` [PATCH v6 " Ezequiel Garcia
2018-07-02 16:49 ` Laurent Pinchart
2018-07-06 15:11 ` Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 05/17] mtk-mdp: Add locks for capture and output vb2_queues Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 06/17] s5p-g2d: Implement wait_prepare and wait_finish Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 07/17] staging: bcm2835-camera: Provide lock for vb2_queue Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 08/17] venus: Add video_device and vb2_queue locks Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 09/17] davinci_vpfe: " Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 10/17] mx_emmaprp: Implement wait_prepare and wait_finish Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 11/17] m2m-deinterlace: " Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 12/17] stk1160: Set the vb2_queue lock before calling vb2_queue_init Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 13/17] dvb-core: Provide lock for vb2_queue Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 14/17] videobuf2-core: require q->lock Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 15/17] videobuf2: assume q->lock is always set Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 16/17] v4l2-ioctl.c: assume queue->lock " Ezequiel Garcia
2018-06-15 19:07 ` [PATCH v4 17/17] media: Remove wait_{prepare, finish} Ezequiel Garcia
2018-06-29 18:12 ` [PATCH v4 00/17] v4l2 core: push ioctl lock down to ioctl handler Ezequiel Garcia
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox