v4l2: mem2mem: save irq flags correctly
PATCH 1/1 v4l2: mem2mem: save irq flags correctly
Save flags correctly when taking spinlocks in v4l2_m2m_try_schedule.
--- drivers/media/v4l2-core/v4l2-mem2mem.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/media/v4l2-core/v4l2-mem2mem.c +11 -8
@@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev)static void v4l2_m2m_try_schedule (struct v4l2_m2m_ctx *m2m_ctx) {struct v4l2_m2m_dev *m2m_dev; -unsigned long flags_job, flags; +unsigned long flags_job, flags_out, flags_cap; m2m_dev = m2m_ctx->m2m_dev;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)return ; } -spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);if (list_empty (&m2m_ctx->out_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No input buffers available\n" );return ; } -spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);if (list_empty (&m2m_ctx->cap_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, + flags_cap); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No output buffers available\n" );return ; } -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);if (m2m_dev->m2m_ops->job_ready && (!m2m_dev->m2m_ops->job_ready (m2m_ctx->priv))) {
Signature · 1 line
1.8.2.1
Hi Sheu,
Thank you for this patch. May I also ask you to add me to Cc of next mem2mem patches, as I am the mem2mem submaintainer?
Best wishes,
Signature · 3 lines
Kamil Debski Linux Kernel Developer Samsung R&D Institute Poland
Quoted 11 lines
-----Original Message-----
From: [email protected] [mailto:linux-media- [email protected]] On Behalf Of John Sheu
Sent: Friday, May 24, 2013 2:42 AM
To: [email protected]
Cc: [email protected]; [email protected]; John Sheu
Subject: [PATCH] [media] v4l2: mem2mem: save irq flags correctlySave flags correctly when taking spinlocks in
v4l2_m2m_try_schedule.Signed-off-by John Sheu <[email protected]>
Quoted 65 lines
--- drivers/media/v4l2-core/v4l2-mem2mem.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)drivers/media/v4l2-core/v4l2-mem2mem.c +10
-8@@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev) static void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx) {struct v4l2_m2m_dev *m2m_dev; -unsigned long flags_job, flags; +unsigned long flags_job, flags_out, flags_cap; m2m_dev = m2m_ctx->m2m_dev;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) return; } -spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);if (list_empty (&m2m_ctx->out_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No input buffers available\n" );return ; } -spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);if (list_empty (&m2m_ctx->cap_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, + flags_cap); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No output buffers available\n" );return ; } -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); + spin_unlock_irqrestore(&m2m_ctx->cap_q_ctx.rdy_spinlock,
flags_cap);drivers/media/v4l2-core/v4l2-mem2mem.c +1
-0+ spin_unlock_irqrestore(&m2m_ctx->out_q_ctx.rdy_spinlock,
flags_out);drivers/media/v4l2-core/v4l2-mem2mem.c +0
-1if (m2m_dev->m2m_ops->job_ready && (!m2m_dev->m2m_ops->job_ready (m2m_ctx->priv))) { --1.8.2.1
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
John, thanks for the patch.
Quoted 3 lines · John Sheu
Save flags correctly when taking spinlocks in
v4l2_m2m_try_schedule.Signed-off-by John Sheu <[email protected]>
Quoted 52 lines
--- drivers/media/v4l2-core/v4l2-mem2mem.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)drivers/media/v4l2-core/v4l2-mem2mem.c +11
-9@@ -205,7 +205,7 @@ static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev)static void v4l2_m2m_try_schedule (struct v4l2_m2m_ctx *m2m_ctx) {struct v4l2_m2m_dev *m2m_dev; -unsigned long flags_job, flags; +unsigned long flags_job, flags_out, flags_cap; m2m_dev = m2m_ctx->m2m_dev;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)return ; } -spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);if (list_empty (&m2m_ctx->out_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No input buffers available\n" );return ; } -spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); +spin_lock_irqsave (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap);if (list_empty (&m2m_ctx->cap_q_ctx.rdy_queue)) { -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, + flags_cap); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, + flags_out);spin_unlock_irqrestore (&m2m_dev->job_spinlock, flags_job);dprintk ("No output buffers available\n" );return ; } -spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags); -spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags); +spin_unlock_irqrestore (&m2m_ctx->cap_q_ctx.rdy_spinlock, flags_cap); +spin_unlock_irqrestore (&m2m_ctx->out_q_ctx.rdy_spinlock, flags_out);if (m2m_dev->m2m_ops->job_ready && (!m2m_dev->m2m_ops->job_ready (m2m_ctx->priv))) { --
Quoted 2 lines
1.8.2.1
--
Best regards,
Pawel Osciak