aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Sheu <sheu@google.com>2013-05-23 19:41:48 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-06-03 14:51:54 -0400
commitb730627ad65f023dd9ce83047a3076330ebaefe5 (patch)
treefd9c036fd95ac9bd68ed7148fd5f03a70a8ded43
parent8fdf94a254ab2f90ae79b82e56b1f8e9d7582026 (diff)
[media] v4l2: mem2mem: save irq flags correctly
Save flags correctly when taking spinlocks in v4l2_m2m_try_schedule. Signed-off-by: John Sheu <sheu@google.com> Signed-off-by: Kamil Debski <k.debski@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/v4l2-core/v4l2-mem2mem.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
index a756170dbe7b..e96497f7c3ed 100644
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
@@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev)
205static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) 205static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx)
206{ 206{
207 struct v4l2_m2m_dev *m2m_dev; 207 struct v4l2_m2m_dev *m2m_dev;
208 unsigned long flags_job, flags; 208 unsigned long flags_job, flags_out, flags_cap;
209 209
210 m2m_dev = m2m_ctx->m2m_dev; 210 m2m_dev = m2m_ctx->m2m_dev;
211 dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx); 211 dprintk("Trying to schedule a job for m2m_ctx: %p\n", m2m_ctx);
@@ -223,23 +223,26 @@ static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx)
223 return; 223 return;
224 } 224 }
225 225
226 spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); 226 spin_lock_irqsave(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);
227 if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) { 227 if (list_empty(&m2m_ctx->out_q_ctx.rdy_queue)) {
228 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); 228 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock,
229 flags_out);
229 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); 230 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
230 dprintk("No input buffers available\n"); 231 dprintk("No input buffers available\n");
231 return; 232 return;
232 } 233 }
233 spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); 234 spin_lock_irqsave(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);
234 if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) { 235 if (list_empty(&m2m_ctx->cap_q_ctx.rdy_queue)) {
235 spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); 236 spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock,
236 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); 237 flags_cap);
238 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock,
239 flags_out);
237 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); 240 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job);
238 dprintk("No output buffers available\n"); 241 dprintk("No output buffers available\n");
239 return; 242 return;
240 } 243 }
241 spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); 244 spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);
242 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags); 245 spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);
243 246
244 if (m2m_dev->m2m_ops->job_ready 247 if (m2m_dev->m2m_ops->job_ready
245 && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { 248 && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) {