mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
spi: imx: fix spi resource leak with dma transfer
In spi_imx_dma_transfer(), when desc_rx = dmaengine_prep_slave_sg() fails, the context goes to label no_dma and then return. However, the memory allocated for desc_tx has not been freed yet, which leads to resource leak. Signed-off-by: Gao Pan <pandy.gao@nxp.com> Reviewed-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
390f0ffe92
commit
ba4a3550e9
@ -927,7 +927,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
|
|||||||
tx->sgl, tx->nents, DMA_MEM_TO_DEV,
|
tx->sgl, tx->nents, DMA_MEM_TO_DEV,
|
||||||
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||||
if (!desc_tx)
|
if (!desc_tx)
|
||||||
goto no_dma;
|
goto tx_nodma;
|
||||||
|
|
||||||
desc_tx->callback = spi_imx_dma_tx_callback;
|
desc_tx->callback = spi_imx_dma_tx_callback;
|
||||||
desc_tx->callback_param = (void *)spi_imx;
|
desc_tx->callback_param = (void *)spi_imx;
|
||||||
@ -939,7 +939,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
|
|||||||
rx->sgl, rx->nents, DMA_DEV_TO_MEM,
|
rx->sgl, rx->nents, DMA_DEV_TO_MEM,
|
||||||
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
|
||||||
if (!desc_rx)
|
if (!desc_rx)
|
||||||
goto no_dma;
|
goto rx_nodma;
|
||||||
|
|
||||||
desc_rx->callback = spi_imx_dma_rx_callback;
|
desc_rx->callback = spi_imx_dma_rx_callback;
|
||||||
desc_rx->callback_param = (void *)spi_imx;
|
desc_rx->callback_param = (void *)spi_imx;
|
||||||
@ -995,7 +995,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
no_dma:
|
rx_nodma:
|
||||||
|
dmaengine_terminate_all(master->dma_tx);
|
||||||
|
tx_nodma:
|
||||||
pr_warn_once("%s %s: DMA not available, falling back to PIO\n",
|
pr_warn_once("%s %s: DMA not available, falling back to PIO\n",
|
||||||
dev_driver_string(&master->dev),
|
dev_driver_string(&master->dev),
|
||||||
dev_name(&master->dev));
|
dev_name(&master->dev));
|
||||||
|
Loading…
Reference in New Issue
Block a user