remoteproc: Fix a memory leak in an error handling path in 'rproc_handle_vdev()'
[ Upstream commit 0374a4ea7269645c46c3eb288526ea072fa19e79 ]
If 'copy_dma_range_map() fails, the memory allocated for 'rvdev' will leak.
Move the 'copy_dma_range_map()' call after the device registration so
that 'rproc_rvdev_release()' can be called to free some resources.
Also, branch to the error handling path if 'copy_dma_range_map()' instead
of a direct return to avoid some other leaks.
Fixes: e0d072782c
("dma-mapping: introduce DMA range map, supplanting dma_pfn_offset")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Jim Quinlan <james.quinlan@broadcom.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/e6d0dad6620da4fdf847faa903f79b735d35f262.1630755377.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
36104e1f71
commit
5061e10234
|
@ -550,9 +550,6 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
|
|||
/* Initialise vdev subdevice */
|
||||
snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index);
|
||||
rvdev->dev.parent = &rproc->dev;
|
||||
ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent);
|
||||
if (ret)
|
||||
return ret;
|
||||
rvdev->dev.release = rproc_rvdev_release;
|
||||
dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name);
|
||||
dev_set_drvdata(&rvdev->dev, rvdev);
|
||||
|
@ -562,6 +559,11 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
|
|||
put_device(&rvdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = copy_dma_range_map(&rvdev->dev, rproc->dev.parent);
|
||||
if (ret)
|
||||
goto free_rvdev;
|
||||
|
||||
/* Make device dma capable by inheriting from parent's capabilities */
|
||||
set_dma_ops(&rvdev->dev, get_dma_ops(rproc->dev.parent));
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user