media: vivid: fix control handler mutex deadlock
authorHans Verkuil <hverkuil@xs4all.nl>
Fri, 21 Oct 2022 12:21:25 +0000 (13:21 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Tue, 25 Oct 2022 15:41:10 +0000 (16:41 +0100)
vivid_update_format_cap() can be called from an s_ctrl callback.
In that case (keep_controls == true) no control framework functions
can be called that take the control handler mutex.

The new call to v4l2_ctrl_modify_dimensions() did exactly that.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Fixes: 6bc7643d1b9c (media: vivid: add pixel_array test control)
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/test-drivers/vivid/vivid-vid-cap.c

index d52d24b..11620ea 100644 (file)
@@ -466,6 +466,14 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
        tpg_s_video_aspect(&dev->tpg, vivid_get_video_aspect(dev));
        tpg_s_pixel_aspect(&dev->tpg, vivid_get_pixel_aspect(dev));
        tpg_update_mv_step(&dev->tpg);
+
+       /*
+        * We can be called from within s_ctrl, in that case we can't
+        * modify controls. Luckily we don't need to in that case.
+        */
+       if (keep_controls)
+               return;
+
        dims[0] = roundup(dev->src_rect.width, PIXEL_ARRAY_DIV);
        dims[1] = roundup(dev->src_rect.height, PIXEL_ARRAY_DIV);
        v4l2_ctrl_modify_dimensions(dev->pixel_array, dims);