diff options
author | Vinod Koul <vinod.koul@intel.com> | 2014-03-06 01:54:08 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-03-17 09:04:11 -0400 |
commit | 9068b032d0ff9285314d57a88051fe4111bbe73a (patch) | |
tree | 80cd2c7749716c1483d2a45bca232587407cd98d | |
parent | ccc7aad04c95c33407444b1387e42162925e5216 (diff) |
dmaengine: pch_dma: use tasklet_kill in teardown
As discussed in [1] the tasklet_disable is not a proper function for teardown.
We need to ensure irq is disabled, followed by ensuring that don't schedule any
more tasklets and then its safe to use tasklet_kill().
Here in pch dma driver we need to use free_irq() before tasklet_kill(). So move
up the free_irq() which will ensure that the irq is disabled and also wait till
all scheduled interrupts are executed by invoking synchronize_irq().
[1]: http://lwn.net/Articles/588457/
Reported-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r-- | drivers/dma/pch_dma.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/dma/pch_dma.c b/drivers/dma/pch_dma.c index 61fdc54a3c88..05fa548bd659 100644 --- a/drivers/dma/pch_dma.c +++ b/drivers/dma/pch_dma.c | |||
@@ -964,16 +964,16 @@ static void pch_dma_remove(struct pci_dev *pdev) | |||
964 | if (pd) { | 964 | if (pd) { |
965 | dma_async_device_unregister(&pd->dma); | 965 | dma_async_device_unregister(&pd->dma); |
966 | 966 | ||
967 | free_irq(pdev->irq, pd); | ||
968 | |||
967 | list_for_each_entry_safe(chan, _c, &pd->dma.channels, | 969 | list_for_each_entry_safe(chan, _c, &pd->dma.channels, |
968 | device_node) { | 970 | device_node) { |
969 | pd_chan = to_pd_chan(chan); | 971 | pd_chan = to_pd_chan(chan); |
970 | 972 | ||
971 | tasklet_disable(&pd_chan->tasklet); | ||
972 | tasklet_kill(&pd_chan->tasklet); | 973 | tasklet_kill(&pd_chan->tasklet); |
973 | } | 974 | } |
974 | 975 | ||
975 | pci_pool_destroy(pd->pool); | 976 | pci_pool_destroy(pd->pool); |
976 | free_irq(pdev->irq, pd); | ||
977 | pci_iounmap(pdev, pd->membase); | 977 | pci_iounmap(pdev, pd->membase); |
978 | pci_release_regions(pdev); | 978 | pci_release_regions(pdev); |
979 | pci_disable_device(pdev); | 979 | pci_disable_device(pdev); |