media: venus: helpers: Lock outside of buffer queue helper
authorStanimir Varbanov <stanimir.varbanov@linaro.org>
Mon, 28 Sep 2020 16:44:31 +0000 (18:44 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 12 Jan 2021 17:32:36 +0000 (18:32 +0100)
After adding more logic in vdec buf_queue vb2 op it is not
practical to have two lock/unlock for one decoder buf_queue.
So move the instance lock in encoder and decoder vb2 buf_queue
operations.

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/helpers.c
drivers/media/platform/qcom/venus/vdec.c
drivers/media/platform/qcom/venus/venc.c

index c25eecb..c2a82cf 100644 (file)
@@ -1338,34 +1338,29 @@ 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);
-
        v4l2_m2m_buf_queue(m2m_ctx, vbuf);
 
        /* Skip processing queued capture buffers after LAST flag */
        if (inst->session_type == VIDC_SESSION_TYPE_DEC &&
            V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
            inst->codec_state == VENUS_DEC_STATE_DRC)
-               goto unlock;
+               return;
 
        cache_payload(inst, vb);
 
        if (inst->session_type == VIDC_SESSION_TYPE_ENC &&
            !(inst->streamon_out && inst->streamon_cap))
-               goto unlock;
+               return;
 
        if (vb2_start_streaming_called(vb->vb2_queue)) {
                ret = is_buf_refed(inst, vbuf);
                if (ret)
-                       goto unlock;
+                       return;
 
                ret = session_process_buf(inst, vbuf);
                if (ret)
                        return_buf_error(inst, vbuf);
        }
-
-unlock:
-       mutex_unlock(&inst->lock);
 }
 EXPORT_SYMBOL_GPL(venus_helper_vb2_buf_queue);
 
index a3e64d1..708af6a 100644 (file)
@@ -1242,9 +1242,8 @@ static void vdec_vb2_buf_queue(struct vb2_buffer *vb)
                return;
        }
 
-       mutex_unlock(&inst->lock);
-
        venus_helper_vb2_buf_queue(vb);
+       mutex_unlock(&inst->lock);
 }
 
 static const struct vb2_ops vdec_vb2_ops = {
index a09550c..248bae1 100644 (file)
@@ -929,13 +929,22 @@ bufs_done:
        return ret;
 }
 
+static void venc_vb2_buf_queue(struct vb2_buffer *vb)
+{
+       struct venus_inst *inst = vb2_get_drv_priv(vb->vb2_queue);
+
+       mutex_lock(&inst->lock);
+       venus_helper_vb2_buf_queue(vb);
+       mutex_unlock(&inst->lock);
+}
+
 static const struct vb2_ops venc_vb2_ops = {
        .queue_setup = venc_queue_setup,
        .buf_init = venus_helper_vb2_buf_init,
        .buf_prepare = venus_helper_vb2_buf_prepare,
        .start_streaming = venc_start_streaming,
        .stop_streaming = venus_helper_vb2_stop_streaming,
-       .buf_queue = venus_helper_vb2_buf_queue,
+       .buf_queue = venc_vb2_buf_queue,
 };
 
 static void venc_buf_done(struct venus_inst *inst, unsigned int buf_type,