Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba4a3550 authored by Gao Pan's avatar Gao Pan Committed by Mark Brown
Browse files

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: default avatarGao Pan <pandy.gao@nxp.com>
Reviewed-by: default avatarFugang Duan <B38611@freescale.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 390f0ffe
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
@@ -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));