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);
 
 
                return;
        }
 
-       mutex_unlock(&inst->lock);
-
        venus_helper_vb2_buf_queue(vb);
+       mutex_unlock(&inst->lock);
 }
 
 static const struct vb2_ops vdec_vb2_ops = {
 
        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,