diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-02 12:07:27 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-02 12:07:27 -0800 |
commit | a234c7371fd8a71faa000745ce6ffee05e1dc07a (patch) | |
tree | 3b6a774cfaf5b80a8ab161e50bdfddb636bb90aa /drivers | |
parent | 4b78317679c4f3782a3cff0ddb269c1fcfde7621 (diff) | |
parent | 77e75fda94d2ebb86aa9d35fb1860f6395bf95de (diff) | |
download | linux-stable-a234c7371fd8a71faa000745ce6ffee05e1dc07a.tar.gz linux-stable-a234c7371fd8a71faa000745ce6ffee05e1dc07a.tar.bz2 linux-stable-a234c7371fd8a71faa000745ce6ffee05e1dc07a.zip |
Merge tag 'dmaengine-fix-4.20-rc5' of git://git.infradead.org/users/vkoul/slave-dma
Pull dmaengine fixes from Vinod Koul:
"This contains two fixes to at_hdmac which fixes long standing bus
reported recently on serial transfers causing memory leak. These fixes
were done by Richard Genoud"
* tag 'dmaengine-fix-4.20-rc5' of git://git.infradead.org/users/vkoul/slave-dma:
dmaengine: at_hdmac: fix module unloading
dmaengine: at_hdmac: fix memory leak in at_dma_xlate()
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dma/at_hdmac.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 7cbac6e8c113..01d936c9fe89 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c @@ -1641,6 +1641,12 @@ static void atc_free_chan_resources(struct dma_chan *chan) atchan->descs_allocated = 0; atchan->status = 0; + /* + * Free atslave allocated in at_dma_xlate() + */ + kfree(chan->private); + chan->private = NULL; + dev_vdbg(chan2dev(chan), "free_chan_resources: done\n"); } @@ -1675,7 +1681,7 @@ static struct dma_chan *at_dma_xlate(struct of_phandle_args *dma_spec, dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); - atslave = devm_kzalloc(&dmac_pdev->dev, sizeof(*atslave), GFP_KERNEL); + atslave = kzalloc(sizeof(*atslave), GFP_KERNEL); if (!atslave) return NULL; @@ -2000,6 +2006,8 @@ static int at_dma_remove(struct platform_device *pdev) struct resource *io; at_dma_off(atdma); + if (pdev->dev.of_node) + of_dma_controller_free(pdev->dev.of_node); dma_async_device_unregister(&atdma->dma_common); dma_pool_destroy(atdma->memset_pool); |