diff options
author | Shaik Ameer Basha <shaik.ameer@samsung.com> | 2013-09-20 02:26:18 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-10-28 13:22:45 -0400 |
commit | 2ad5389b341282636644d917685029b4bb50553c (patch) | |
tree | 9f2832c8b42a96f7d7fc0d1607de4e8b910f2b57 | |
parent | d9315160ed4dc76f6f01acb1b05e92e2a891b9bb (diff) |
[media] v4l2-mem2mem: Don't schedule the context if abort job is called
When the current context is running,
1] If release is called, it waits until the job is finished.
2] As soon as the job is finished, v4l2_mem_ctx_release()tries to
release the vb2 queues.
3] But if the current context can be scheduled in the v4l2_m2m_job_finish()
it schedules the context and tries to call device_run().
4] As the release() and device_run() sequence can't be predicted sometimes
device_run() may get empty vb2 buffers.
This patch adds the ABORT state to the job_flags. Once the job_abort() or
release() is called on the context, the same context will not be scheduled in
the v4l2_m2m_job_finish().
Signed-off-by: Shaik Ameer Basha <shaik.ameer@samsung.com>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/v4l2-core/v4l2-mem2mem.c | 12 |
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); |