diff options
author | Andy Green <andy@openmoko.com> | 2008-11-19 17:11:08 +0000 |
---|---|---|
committer | Andy Green <agreen@pads.home.warmcat.com> | 2008-11-19 17:11:08 +0000 |
commit | b33527d4cb37eb5e353d7bdf99775aad893fc4e9 (patch) | |
tree | 3977a3eeceacf4ce197ccad037312f1af8d5568e /drivers | |
parent | 6ea0a4bc5283a254c939f44206b2abde3cb7da45 (diff) |
fix-glamo-irq-recursive-locking.patch
Running heavily instrumented kernel, get report about glamo IRQ spinlock
probem.
[ 8.795000] =============================================
[ 8.795000] [ INFO: possible recursive locking detected ]
[ 8.795000] 2.6.24 #782
[ 8.795000] ---------------------------------------------
[ 8.795000] swapper/1 is trying to acquire lock:
[ 8.795000] (&irq_desc_lock_class){++..}, at: [<c0077ae4>] handle_level_irq+0x24/0x120
[ 8.795000]
[ 8.795000] but task is already holding lock:
[ 8.795000] (&irq_desc_lock_class){++..}, at: [<c01be628>] glamo_irq_demux_handler+0x24/0x140
[ 8.795000]
[ 8.795000] other info that might help us debug this:
[ 8.795000] 1 lock held by swapper/1:
[ 8.795000] #0: (&irq_desc_lock_class){++..}, at: [<c01be628>] glamo_irq_demux_handler+0x24/0x140
[ 8.795000]
[ 8.795000] stack backtrace:
[ 8.795000] [<c002ec28>] (dump_stack+0x0/0x14) from [<c006ad74>] (__lock_acquire+0x9a0/0xdec)
[ 8.795000] [<c006a3d4>] (__lock_acquire+0x0/0xdec) from [<c006b264>] (lock_acquire+0xa4/0xc0)
[ 8.795000] [<c006b1c0>] (lock_acquire+0x0/0xc0) from [<c02f7878>] (_spin_lock+0x44/0x78)
[ 8.795000] [<c02f7834>] (_spin_lock+0x0/0x78) from [<c0077ae4>] (handle_level_irq+0x24/0x120)
[ 8.795000] r6:c03e11c0 r5:0000005c r4:c03e11c0
[ 8.795000] [<c0077ac0>] (handle_level_irq+0x0/0x120) from [<c01be708>] (glamo_irq_demux_handler+0x104/0x140)
[ 8.795000] r7:00000038 r6:c03e11c0 r5:00000008 r4:c03e0560
[ 8.795000] [<c01be604>] (glamo_irq_demux_handler+0x0/0x140) from [<c003c934>] (s3c_irq_demux_extint8+0x94/0xa4)
[ 8.795000] r8:00000002 r7:00000003 r6:00000000 r5:c03df958 r4:00000000
[ 8.795000] [<c003c8a0>] (s3c_irq_demux_extint8+0x0/0xa4) from [<c0029048>] (__exception_text_start+0x48/0x64)
[ 8.795000] r4:00000015
[ 8.795000] [<c0029000>] (__exception_text_start+0x0/0x64) from [<c0029a5c>] (__irq_svc+0x3c/0xb4)
Patch removes desc->lock locking around glamo_irq_demux_handler... guess it is OK
since we didn't clear interrupt source, can't recurse?
Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mfd/glamo/glamo-core.c | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/drivers/mfd/glamo/glamo-core.c b/drivers/mfd/glamo/glamo-core.c index 77e25a65a9b..287807a0d0c 100644 --- a/drivers/mfd/glamo/glamo-core.c +++ b/drivers/mfd/glamo/glamo-core.c @@ -348,15 +348,13 @@ static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc) { const unsigned int cpu = smp_processor_id(); - spin_lock(&desc->lock); - desc->status &= ~(IRQ_REPLAY | IRQ_WAITING); if (unlikely(desc->status & IRQ_INPROGRESS)) { desc->status |= (IRQ_PENDING | IRQ_MASKED); desc->chip->mask(irq); desc->chip->ack(irq); - goto out_unlock; + return; } kstat_cpu(cpu).irqs[irq]++; @@ -387,9 +385,6 @@ static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc) } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING); desc->status &= ~IRQ_INPROGRESS; - -out_unlock: - spin_unlock(&desc->lock); } /*********************************************************************** |