Commit a3fd8019 authored by Philipp Zabel's avatar Philipp Zabel Committed by Mauro Carvalho Chehab

media: coda: fix deadlock between decoder picture run and start command

The BIT decoder picture run temporarily locks the bitstream mutex while
the coda device mutex is locked, to refill the bitstream ring buffer.
Consequently, the decoder start command, which locks both mutexes when
flushing the bitstream ring buffer, must lock the coda device mutex
first as well, to avoid an ABBA deadlock.

Fixes: e7fd9584 ("media: coda: flush bitstream ring buffer on decoder restart")
Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 545b618c
...@@ -1084,16 +1084,16 @@ static int coda_decoder_cmd(struct file *file, void *fh, ...@@ -1084,16 +1084,16 @@ static int coda_decoder_cmd(struct file *file, void *fh,
switch (dc->cmd) { switch (dc->cmd) {
case V4L2_DEC_CMD_START: case V4L2_DEC_CMD_START:
mutex_lock(&ctx->bitstream_mutex);
mutex_lock(&dev->coda_mutex); mutex_lock(&dev->coda_mutex);
mutex_lock(&ctx->bitstream_mutex);
coda_bitstream_flush(ctx); coda_bitstream_flush(ctx);
mutex_unlock(&dev->coda_mutex);
dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
V4L2_BUF_TYPE_VIDEO_CAPTURE); V4L2_BUF_TYPE_VIDEO_CAPTURE);
vb2_clear_last_buffer_dequeued(dst_vq); vb2_clear_last_buffer_dequeued(dst_vq);
ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG; ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG;
coda_fill_bitstream(ctx, NULL); coda_fill_bitstream(ctx, NULL);
mutex_unlock(&ctx->bitstream_mutex); mutex_unlock(&ctx->bitstream_mutex);
mutex_unlock(&dev->coda_mutex);
break; break;
case V4L2_DEC_CMD_STOP: case V4L2_DEC_CMD_STOP:
stream_end = false; stream_end = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment