]> err.no Git - linux-2.6/commitdiff
[PATCH] fix deadlock in drivers/pci/msi.c
authorIngo Molnar <mingo@elte.hu>
Thu, 26 Jan 2006 00:42:11 +0000 (01:42 +0100)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 31 Jan 2006 19:30:18 +0000 (11:30 -0800)
The lock validator caught another one: drivers/pci/msi.c is accessing
&irq_desc[i].lock with interrupts enabled (!).

The fix is to disable interrupts properly.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/pci/msi.c

index 202b7507a357092906680bd9e937e7882e428324..8e1ba0b7a8e41770a2ab4e18c835b682c2a2a0a1 100644 (file)
@@ -416,7 +416,9 @@ static void attach_msi_entry(struct msi_desc *entry, int vector)
 
 static void irq_handler_init(int cap_id, int pos, int mask)
 {
-       spin_lock(&irq_desc[pos].lock);
+       unsigned long flags;
+
+       spin_lock_irqsave(&irq_desc[pos].lock, flags);
        if (cap_id == PCI_CAP_ID_MSIX)
                irq_desc[pos].handler = &msix_irq_type;
        else {
@@ -425,7 +427,7 @@ static void irq_handler_init(int cap_id, int pos, int mask)
                else
                        irq_desc[pos].handler = &msi_irq_w_maskbit_type;
        }
-       spin_unlock(&irq_desc[pos].lock);
+       spin_unlock_irqrestore(&irq_desc[pos].lock, flags);
 }
 
 static void enable_msi_mode(struct pci_dev *dev, int pos, int type)