On 2008.02.07 00:58:42 +0100, Thomas Gleixner wrote:Hm, do you have lockdep enabled? If not, does lockdep make this go away? Because lockdep will set IRQF_DISABLED for all interrupt handlers, and unless that flag is set, handle_IRQ_event will reenable interrupts while the handler is running. And ahci_interrupt only uses a plain spin_lock, so interrupts keep being enabled. The patch below should help with that. Hmhm, maybe that also solves the deadlock you saw? Dunno... I can't come up with an useful commit message right now, but I'll resend in suitable form for submission if that thing actually works. Björn diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 1db93b6..ae3dbc8 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1739,6 +1739,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) unsigned int i, handled = 0; void __iomem *mmio; u32 irq_stat, irq_ack = 0; + unsigned long flags; VPRINTK("ENTER\n"); @@ -1751,7 +1752,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) if (!irq_stat) return IRQ_NONE; - spin_lock(&host->lock); + spin_lock_irqsave(&host->lock, flags); for (i = 0; i < host->n_ports; i++) { struct ata_port *ap; @@ -1778,7 +1779,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance) handled = 1; } - spin_unlock(&host->lock); + spin_unlock_irqrestore(&host->lock, flags); VPRINTK("EXIT\n"); --
| Linus Torvalds | Re: LSM conversion to static interface |
| Ingo Molnar | [patch 03/13] syslets: generic kernel bits |
| Ingo Molnar | Re: [PATCH 6/6] sched: disabled rt-bandwidth by default |
| Greg Kroah-Hartman | [PATCH 001/196] Chinese: Add the known_regression URI to the HOWTO |
git: | |
| David Miller | [GIT]: Networking |
| Gregory Haskins | [RFC PATCH 00/17] virtual-bus |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
