summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2019-01-11 07:07:25 -0500
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2019-01-16 11:13:25 -0500
commit240809ef6630a4ce57c273c2d79ffb657cd361eb (patch)
tree794175bca1a6628ab8229f756f2f455d1ebca8b3 /drivers/media/platform
parent7fe9f01c04c2673bd6662c35b664f0f91888b96f (diff)
downloadlinux-240809ef6630a4ce57c273c2d79ffb657cd361eb.tar.gz
linux-240809ef6630a4ce57c273c2d79ffb657cd361eb.tar.bz2
linux-240809ef6630a4ce57c273c2d79ffb657cd361eb.zip
media: vim2m: only cancel work if it is for right context
cancel_delayed_work_sync() was called for any queue, but it should only be called for the queue that is associated with the currently running job. Otherwise, if two filehandles are streaming at the same time, then closing the first will cancel the work which might still be running for a job from the second filehandle. As a result the second filehandle will never be able to finish the job and an attempt to stop streaming on that second filehandle will stall. Fixes: 52117be68b82 ("media: vim2m: use cancel_delayed_work_sync instead of flush_schedule_work") Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Cc: <stable@vger.kernel.org> # for v4.20 and up Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/vim2m.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c
index d01821a6906a..89d9c4c21037 100644
--- a/drivers/media/platform/vim2m.c
+++ b/drivers/media/platform/vim2m.c
@@ -807,7 +807,9 @@ static void vim2m_stop_streaming(struct vb2_queue *q)
struct vb2_v4l2_buffer *vbuf;
unsigned long flags;
- cancel_delayed_work_sync(&dev->work_run);
+ if (v4l2_m2m_get_curr_priv(dev->m2m_dev) == ctx)
+ cancel_delayed_work_sync(&dev->work_run);
+
for (;;) {
if (V4L2_TYPE_IS_OUTPUT(q->type))
vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx);