aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:11:08 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:11:08 +0000
commitb33527d4cb37eb5e353d7bdf99775aad893fc4e9 (patch)
tree3977a3eeceacf4ce197ccad037312f1af8d5568e /drivers
parent6ea0a4bc5283a254c939f44206b2abde3cb7da45 (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.c7
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);
}
/***********************************************************************