Implement proper cleanup inside vdec_m2m_job_abort to safely stop the hardware job sequence during a streaming abort or teardown.
Without this, if a job is aborted right after being triggered, the deferred work item (esparser_queue_work) scheduled by device_run could continue running concurrently. This leads to unexpected behavior and potential use-after-free bugs if session structures are cleared. Fix this by flagging the session to stop via WRITE_ONCE, synchronously canceling any pending parser work, and safely clearing the active core session pointer under the core lock protection. Cc: Nicolas Dufresne <[email protected]> Signed-off-by: Anand Moon <[email protected]> --- drivers/staging/media/meson/vdec/vdec.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c index b3e1d99e8889f..ac86a9c4febff 100644 --- a/drivers/staging/media/meson/vdec/vdec.c +++ b/drivers/staging/media/meson/vdec/vdec.c @@ -167,6 +167,17 @@ static void vdec_m2m_device_run(void *priv) static void vdec_m2m_job_abort(void *priv) { struct amvdec_session *sess = priv; + struct amvdec_core *core = sess->core; + + WRITE_ONCE(sess->should_stop, 1); + + cancel_work_sync(&sess->esparser_queue_work); + + mutex_lock(&core->lock); + if (core->cur_sess == sess) + /* Safely clear hardware ownership since we were confirmed as the owner */ + smp_store_release(&core->cur_sess, NULL); + mutex_unlock(&core->lock); v4l2_m2m_job_finish(sess->core->m2m_dev, sess->m2m_ctx); } -- 2.50.1
