media: vb2: use lock if wait_prepare/finish are NULL
authorHans Verkuil <hverkuil-cisco@xs4all.nl>
Mon, 2 Sep 2024 14:04:55 +0000 (16:04 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 12 Oct 2024 13:54:08 +0000 (15:54 +0200)
If the wait_prepare or wait_finish callback is set, then call it.
If it is NULL and the queue lock pointer is not NULL, then just
unlock/lock that mutex.

This allows simplifying drivers by dropping the wait_prepare and
wait_finish ops (and eventually the vb2_ops_wait_prepare/finish helpers).

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/common/videobuf2/videobuf2-core.c

index 6335ac7b771a3051320f306907c221c98559c258..d064e0664851b26b2da71e0a374c49a2d2c5e217 100644 (file)
@@ -2035,7 +2035,10 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
                 * become ready or for streamoff. Driver's lock is released to
                 * allow streamoff or qbuf to be called while waiting.
                 */
-               call_void_qop(q, wait_prepare, q);
+               if (q->ops->wait_prepare)
+                       call_void_qop(q, wait_prepare, q);
+               else if (q->lock)
+                       mutex_unlock(q->lock);
 
                /*
                 * All locks have been released, it is safe to sleep now.
@@ -2045,12 +2048,16 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
                                !list_empty(&q->done_list) || !q->streaming ||
                                q->error);
 
+               if (q->ops->wait_finish)
+                       call_void_qop(q, wait_finish, q);
+               else if (q->lock)
+                       mutex_lock(q->lock);
+
+               q->waiting_in_dqbuf = 0;
                /*
                 * 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);
-               q->waiting_in_dqbuf = 0;
                if (ret) {
                        dprintk(q, 1, "sleep was interrupted\n");
                        return ret;