dmaengine: fsl-qdma: Fix a memory leak related to the status queue DMA
[ Upstream commit 968bc1d7203d384e72afe34124a1801b7af76514 ]
This dma_alloc_coherent() is undone in the remove function, but not in the
error handling path of fsl_qdma_probe().
Switch to the managed version to fix the issue in the probe and simplify
the remove function.
Fixes: b092529e0a
("dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Link: https://lore.kernel.org/r/a0ef5d0f5a47381617ef339df776ddc68ce48173.1704621515.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
3496a1da71
commit
fbe1c5c6a8
@@ -563,11 +563,11 @@ static struct fsl_qdma_queue
|
|||||||
/*
|
/*
|
||||||
* Buffer for queue command
|
* Buffer for queue command
|
||||||
*/
|
*/
|
||||||
status_head->cq = dma_alloc_coherent(&pdev->dev,
|
status_head->cq = dmam_alloc_coherent(&pdev->dev,
|
||||||
sizeof(struct fsl_qdma_format) *
|
sizeof(struct fsl_qdma_format) *
|
||||||
status_size,
|
status_size,
|
||||||
&status_head->bus_addr,
|
&status_head->bus_addr,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!status_head->cq) {
|
if (!status_head->cq) {
|
||||||
devm_kfree(&pdev->dev, status_head);
|
devm_kfree(&pdev->dev, status_head);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1272,8 +1272,6 @@ static void fsl_qdma_cleanup_vchan(struct dma_device *dmadev)
|
|||||||
|
|
||||||
static int fsl_qdma_remove(struct platform_device *pdev)
|
static int fsl_qdma_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
struct fsl_qdma_queue *status;
|
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
struct fsl_qdma_engine *fsl_qdma = platform_get_drvdata(pdev);
|
struct fsl_qdma_engine *fsl_qdma = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
@@ -1282,11 +1280,6 @@ static int fsl_qdma_remove(struct platform_device *pdev)
|
|||||||
of_dma_controller_free(np);
|
of_dma_controller_free(np);
|
||||||
dma_async_device_unregister(&fsl_qdma->dma_dev);
|
dma_async_device_unregister(&fsl_qdma->dma_dev);
|
||||||
|
|
||||||
for (i = 0; i < fsl_qdma->block_number; i++) {
|
|
||||||
status = fsl_qdma->status[i];
|
|
||||||
dma_free_coherent(&pdev->dev, sizeof(struct fsl_qdma_format) *
|
|
||||||
status->n_cq, status->cq, status->bus_addr);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user