Commit 68660710 authored by Logan Gunthorpe's avatar Logan Gunthorpe Committed by Vinod Koul

dmaengine: Call module_put() after device_free_chan_resources()

The module reference is taken to ensure the callbacks still exist
when they are called. If the channel holds the last reference to the
module, the module can disappear before device_free_chan_resources() is
called and would cause a call into free'd memory.
Signed-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Link: https://lore.kernel.org/r/20191216190120.21374-3-logang@deltatee.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent dae7a589
...@@ -250,7 +250,6 @@ static void dma_chan_put(struct dma_chan *chan) ...@@ -250,7 +250,6 @@ static void dma_chan_put(struct dma_chan *chan)
return; return;
chan->client_count--; chan->client_count--;
module_put(dma_chan_to_owner(chan));
/* This channel is not in use anymore, free it */ /* This channel is not in use anymore, free it */
if (!chan->client_count && chan->device->device_free_chan_resources) { if (!chan->client_count && chan->device->device_free_chan_resources) {
...@@ -259,6 +258,8 @@ static void dma_chan_put(struct dma_chan *chan) ...@@ -259,6 +258,8 @@ static void dma_chan_put(struct dma_chan *chan)
chan->device->device_free_chan_resources(chan); chan->device->device_free_chan_resources(chan);
} }
module_put(dma_chan_to_owner(chan));
/* If the channel is used via a DMA request router, free the mapping */ /* If the channel is used via a DMA request router, free the mapping */
if (chan->router && chan->router->route_free) { if (chan->router && chan->router->route_free) {
chan->router->route_free(chan->router->dev, chan->route_data); chan->router->route_free(chan->router->dev, chan->route_data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment