disable_irq() should wait for all running handlers to complete
before returning. As such, if it's used to disable an interrupt
from that interrupt's handler it will deadlock. This replaces
the dangerous instances with the _nosync() variant which doesn't
have this problem.
Signed-off-by: Ben Nizette <[email protected]>
---
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
index 5570849..d5ea652 100644
--- a/drivers/mmc/host/omap.c
+++ b/drivers/mmc/host/omap.c
@@ -824,7 +824,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
del_timer(&host->cmd_abort_timer);
host->abort = 1;
OMAP_MMC_WRITE(host, IE, 0);
- disable_irq(host->irq);
+ disable_irq_nosync(host->irq);
schedule_work(&host->cmd_abort_work);
return IRQ_HANDLED;
}
--
1.6.0.2
Should I queue this up or do you want to do something differently for
this?
On Thu, 16 Apr 2009 15:55:21 +1000
Ben Nizette <[email protected]> wrote:
>
> disable_irq() should wait for all running handlers to complete
> before returning. As such, if it's used to disable an interrupt
> from that interrupt's handler it will deadlock. This replaces
> the dangerous instances with the _nosync() variant which doesn't
> have this problem.
>
> Signed-off-by: Ben Nizette <[email protected]>
> ---
> diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c
> index 5570849..d5ea652 100644
> --- a/drivers/mmc/host/omap.c
> +++ b/drivers/mmc/host/omap.c
> @@ -824,7 +824,7 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id)
> del_timer(&host->cmd_abort_timer);
> host->abort = 1;
> OMAP_MMC_WRITE(host, IE, 0);
> - disable_irq(host->irq);
> + disable_irq_nosync(host->irq);
> schedule_work(&host->cmd_abort_work);
> return IRQ_HANDLED;
> }
--
-- Pierre Ossman
WARNING: This correspondence is being monitored by the
Swedish government. Make sure your server uses encryption
for SMTP traffic and consider using PGP for end-to-end
encryption.