Re: [PATCH] iommu/dart: add missing put_device() call in apple_dart_of_xlate
From: Will Deacon <will@kernel.org>
Date: 2025-07-14 11:23:24
Also in:
asahi, linux-iommu, lkml
On Sun, Jul 13, 2025 at 12:16:24AM +0800, Zhang Shurong wrote:
quoted hunk ↗ jump to hunk
The apple_dart_of_xlate() function obtains a platform device reference via of_find_device_by_node() but doesn't release it with put_device(). This patch adds proper device reference handling to prevent memory leaks. Fixes: 46d1fb072e76 ("iommu/dart: Add DART iommu driver") Signed-off-by: Zhang Shurong <redacted> --- drivers/iommu/apple-dart.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c index 190f28d76615..811bf5176568 100644 --- a/drivers/iommu/apple-dart.c +++ b/drivers/iommu/apple-dart.c@@ -796,8 +796,10 @@ static int apple_dart_of_xlate(struct device *dev, if (!cfg) { cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); - if (!cfg) + if (!cfg) { + put_device(&iommu_pdev->dev); return -ENOMEM; + } /* Will be ANDed with DART capabilities */ cfg->supports_bypass = true; }@@ -805,8 +807,10 @@ static int apple_dart_of_xlate(struct device *dev, cfg_dart = cfg->stream_maps[0].dart; if (cfg_dart) { - if (cfg_dart->pgsize != dart->pgsize) + if (cfg_dart->pgsize != dart->pgsize) { + put_device(&iommu_pdev->dev); return -EINVAL; + } } cfg->supports_bypass &= dart->supports_bypass;@@ -825,6 +829,8 @@ static int apple_dart_of_xlate(struct device *dev, } } + + put_device(&iommu_pdev->dev); return -EINVAL;
Why is it correct to retain the reference on the device in the cases where this function returns 0? Will