Skip to content

Commit 42dc622

Browse files
Ming Qiangregkh
authored andcommitted
media: amphion: Fix race between m2m job_abort and device_run
commit 8cd35ce upstream. Fix kernel panic caused by race condition where v4l2_m2m_ctx_release() frees m2m_ctx while v4l2_m2m_try_run() is about to call device_run with the same context. Race sequence: v4l2_m2m_try_run(): v4l2_m2m_ctx_release(): lock/unlock v4l2_m2m_cancel_job() job_abort() v4l2_m2m_job_finish() kfree(m2m_ctx) <- frees ctx device_run() <- use-after-free crash at 0x538 Crash trace: Unable to handle kernel read from unreadable memory at virtual address 0000000000000538 v4l2_m2m_try_run+0x78/0x138 v4l2_m2m_device_run_work+0x14/0x20 The amphion vpu driver does not rely on the m2m framework's device_run callback to perform encode/decode operations. Fix the race by preventing m2m framework job scheduling entirely: - Add job_ready callback returning 0 (no jobs ready for m2m framework) - Remove job_abort callback to avoid the race condition Fixes: 3cd0845 ("media: amphion: add vpu v4l2 m2m support") Cc: stable@vger.kernel.org Signed-off-by: Ming Qian <ming.qian@oss.nxp.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 0ba03e0 commit 42dc622

1 file changed

Lines changed: 3 additions & 6 deletions

File tree

drivers/media/platform/amphion/vpu_v4l2.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -441,17 +441,14 @@ static void vpu_m2m_device_run(void *priv)
441441
{
442442
}
443443

444-
static void vpu_m2m_job_abort(void *priv)
444+
static int vpu_m2m_job_ready(void *priv)
445445
{
446-
struct vpu_inst *inst = priv;
447-
struct v4l2_m2m_ctx *m2m_ctx = inst->fh.m2m_ctx;
448-
449-
v4l2_m2m_job_finish(m2m_ctx->m2m_dev, m2m_ctx);
446+
return 0;
450447
}
451448

452449
static const struct v4l2_m2m_ops vpu_m2m_ops = {
453450
.device_run = vpu_m2m_device_run,
454-
.job_abort = vpu_m2m_job_abort
451+
.job_ready = vpu_m2m_job_ready,
455452
};
456453

457454
static int vpu_vb2_queue_setup(struct vb2_queue *vq,

0 commit comments

Comments
 (0)