diff options
author | Mark Lord <liml@rtr.ca> | 2009-03-10 16:28:51 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2009-03-13 14:55:44 -0400 |
commit | 9d51af7bd2f1d730cb6eeeb9ff837e3441ad4e07 (patch) | |
tree | 7651fdab75e8a6b7c2f2d17aadd6bc9e5a239393 /drivers/ata | |
parent | 041b62374c7fedc11a8a1eeda2868612d3d1436c (diff) | |
download | linux-stable-9d51af7bd2f1d730cb6eeeb9ff837e3441ad4e07.tar.gz linux-stable-9d51af7bd2f1d730cb6eeeb9ff837e3441ad4e07.tar.bz2 linux-stable-9d51af7bd2f1d730cb6eeeb9ff837e3441ad4e07.zip |
sata_mv: fix MSI irq race condition
Fix a (rare) race condition in mv_interrupt() when using MSI.
The value of hpriv->main_irq_mask_addr can change on on the fly,
and without this patch we could end up writing back a stale copy
to the hardware.
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/sata_mv.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 7007edd2d451..74b1080d116d 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c @@ -2218,12 +2218,13 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance) else handled = mv_host_intr(host, pending_irqs); } - spin_unlock(&host->lock); /* for MSI: unmask; interrupt cause bits will retrigger now */ if (using_msi) writel(hpriv->main_irq_mask, hpriv->main_irq_mask_addr); + spin_unlock(&host->lock); + return IRQ_RETVAL(handled); } |