From b33527d4cb37eb5e353d7bdf99775aad893fc4e9 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Wed, 19 Nov 2008 17:11:08 +0000 Subject: 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: [] handle_level_irq+0x24/0x120 [ 8.795000] [ 8.795000] but task is already holding lock: [ 8.795000] (&irq_desc_lock_class){++..}, at: [] 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: [] glamo_irq_demux_handler+0x24/0x140 [ 8.795000] [ 8.795000] stack backtrace: [ 8.795000] [] (dump_stack+0x0/0x14) from [] (__lock_acquire+0x9a0/0xdec) [ 8.795000] [] (__lock_acquire+0x0/0xdec) from [] (lock_acquire+0xa4/0xc0) [ 8.795000] [] (lock_acquire+0x0/0xc0) from [] (_spin_lock+0x44/0x78) [ 8.795000] [] (_spin_lock+0x0/0x78) from [] (handle_level_irq+0x24/0x120) [ 8.795000] r6:c03e11c0 r5:0000005c r4:c03e11c0 [ 8.795000] [] (handle_level_irq+0x0/0x120) from [] (glamo_irq_demux_handler+0x104/0x140) [ 8.795000] r7:00000038 r6:c03e11c0 r5:00000008 r4:c03e0560 [ 8.795000] [] (glamo_irq_demux_handler+0x0/0x140) from [] (s3c_irq_demux_extint8+0x94/0xa4) [ 8.795000] r8:00000002 r7:00000003 r6:00000000 r5:c03df958 r4:00000000 [ 8.795000] [] (s3c_irq_demux_extint8+0x0/0xa4) from [] (__exception_text_start+0x48/0x64) [ 8.795000] r4:00000015 [ 8.795000] [] (__exception_text_start+0x0/0x64) from [] (__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 --- drivers/mfd/glamo/glamo-core.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'drivers/mfd/glamo/glamo-core.c') 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); } /*********************************************************************** -- cgit v1.2.3