| From 2e6736979a6ef799451cb8b9a7fc2233b25d5644 Mon Sep 17 00:00:00 2001 |
| From: Ezequiel Garcia <ezequiel@collabora.com> |
| Date: Wed, 2 Oct 2019 14:29:23 -0300 |
| Subject: [PATCH] iommu: rockchip: Free domain on .domain_free |
| |
| commit 42bb97b80f2e3bf592e3e99d109b67309aa1b30e upstream. |
| |
| IOMMU domain resource life is well-defined, managed |
| by .domain_alloc and .domain_free. |
| |
| Therefore, domain-specific resources shouldn't be tied to |
| the device life, but instead to its domain. |
| |
| Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> |
| Reviewed-by: Robin Murphy <robin.murphy@arm.com> |
| Acked-by: Heiko Stuebner <heiko@sntech.de> |
| Signed-off-by: Joerg Roedel <jroedel@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c |
| index dc26d74d79c2..16e056d1407c 100644 |
| --- a/drivers/iommu/rockchip-iommu.c |
| +++ b/drivers/iommu/rockchip-iommu.c |
| @@ -979,13 +979,13 @@ static struct iommu_domain *rk_iommu_domain_alloc(unsigned type) |
| if (!dma_dev) |
| return NULL; |
| |
| - rk_domain = devm_kzalloc(dma_dev, sizeof(*rk_domain), GFP_KERNEL); |
| + rk_domain = kzalloc(sizeof(*rk_domain), GFP_KERNEL); |
| if (!rk_domain) |
| return NULL; |
| |
| if (type == IOMMU_DOMAIN_DMA && |
| iommu_get_dma_cookie(&rk_domain->domain)) |
| - return NULL; |
| + goto err_free_domain; |
| |
| /* |
| * rk32xx iommus use a 2 level pagetable. |
| @@ -1020,6 +1020,8 @@ static struct iommu_domain *rk_iommu_domain_alloc(unsigned type) |
| err_put_cookie: |
| if (type == IOMMU_DOMAIN_DMA) |
| iommu_put_dma_cookie(&rk_domain->domain); |
| +err_free_domain: |
| + kfree(rk_domain); |
| |
| return NULL; |
| } |
| @@ -1048,6 +1050,7 @@ static void rk_iommu_domain_free(struct iommu_domain *domain) |
| |
| if (domain->type == IOMMU_DOMAIN_DMA) |
| iommu_put_dma_cookie(&rk_domain->domain); |
| + kfree(rk_domain); |
| } |
| |
| static int rk_iommu_add_device(struct device *dev) |
| -- |
| 2.7.4 |
| |