aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/v4l2-core/v4l2-mem2mem.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
index 796de3349303..73035ee0f4de 100644
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
@@ -41,6 +41,8 @@ module_param(debug, bool, 0644);
41#define TRANS_QUEUED (1 << 0) 41#define TRANS_QUEUED (1 << 0)
42/* Instance is currently running in hardware */ 42/* Instance is currently running in hardware */
43#define TRANS_RUNNING (1 << 1) 43#define TRANS_RUNNING (1 << 1)
44/* Instance is currently aborting */
45#define TRANS_ABORT (1 << 2)
44 46
45 47
46/* Offset base for buffers on the destination queue - used to distinguish 48/* Offset base for buffers on the destination queue - used to distinguish
@@ -221,6 +223,14 @@ static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx)
221 } 223 }
222 224
223 spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); 225 spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job);
226
227 /* If the context is aborted then don't schedule it */
228 if (m2m_ctx->job_flags & TRANS_ABORT) {
229 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
230 dprintk("Aborted context\n");
231 return;
232 }
233
224 if (m2m_ctx->job_flags & TRANS_QUEUED) { 234 if (m2m_ctx->job_flags & TRANS_QUEUED) {
225 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); 235 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
226 dprintk("On job queue already\n"); 236 dprintk("On job queue already\n");
@@ -280,6 +290,8 @@ static void v4l2_m2m_cancel_job(struct v4l2_m2m_ctx *m2m_ctx)
280 290
281 m2m_dev = m2m_ctx->m2m_dev; 291 m2m_dev = m2m_ctx->m2m_dev;
282 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); 292 spin_lock_irqsave(&m2m_dev->job_spinlock, flags);
293
294 m2m_ctx->job_flags |= TRANS_ABORT;
283 if (m2m_ctx->job_flags & TRANS_RUNNING) { 295 if (m2m_ctx->job_flags & TRANS_RUNNING) {
284 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); 296 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
285 m2m_dev->m2m_ops->job_abort(m2m_ctx->priv); 297 m2m_dev->m2m_ops->job_abort(m2m_ctx->priv);