iommu.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@nvidia.com>
To: Lu Baolu <baolu.lu@linux.intel.com>
Cc: Joerg Roedel <joro@8bytes.org>,
	Christoph Hellwig <hch@infradead.org>,
	Kevin Tian <kevin.tian@intel.com>, Will Deacon <will@kernel.org>,
	Robin Murphy <robin.murphy@arm.com>,
	Jean-Philippe Brucker <jean-philippe@linaro.org>,
	Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>,
	Hector Martin <marcan@marcan.st>, Sven Peter <sven@svenpeter.dev>,
	Rob Clark <robdclark@gmail.com>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>,
	Andy Gross <agross@kernel.org>,
	Bjorn Andersson <andersson@kernel.org>,
	Yong Wu <yong.wu@mediatek.com>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Heiko Stuebner <heiko@sntech.de>,
	Matthew Rosato <mjrosato@linux.ibm.com>,
	Orson Zhai <orsonzhai@gmail.com>,
	Baolin Wang <baolin.wang@linux.alibaba.com>,
	Chunyan Zhang <zhang.lyra@gmail.com>,
	Chen-Yu Tsai <wens@csie.org>,
	Thierry Reding <thierry.reding@gmail.com>,
	iommu@lists.linux.dev, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 18/20] iommu: Call set_platform_dma if default domain is unavailable
Date: Mon, 28 Nov 2022 10:57:07 -0400	[thread overview]
Message-ID: <Y4TMQ7HazPWMdsNj@nvidia.com> (raw)
In-Reply-To: <20221128064648.1934720-19-baolu.lu@linux.intel.com>

On Mon, Nov 28, 2022 at 02:46:46PM +0800, Lu Baolu wrote:
> If the IOMMU driver has no default domain support, call set_platform_dma
> explicitly to return the kernel DMA control back to the platform DMA ops.
> 
> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
> ---
>  drivers/iommu/iommu.c | 28 ++++++++--------------------
>  1 file changed, 8 insertions(+), 20 deletions(-)
> 
> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
> index 7c99d8eb3182..e4966f088184 100644
> --- a/drivers/iommu/iommu.c
> +++ b/drivers/iommu/iommu.c
> @@ -2040,16 +2040,6 @@ int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain)
>  	return 0;
>  }
>  
> -static void __iommu_detach_device(struct iommu_domain *domain,
> -				  struct device *dev)
> -{
> -	if (iommu_is_attach_deferred(dev))
> -		return;

This removal might want to be its own patch with an explanation.

It looks like at the current moment __iommu_detach_device() is only
called via call chains that are after the device driver is attached -
eg via explicit attach APIs called by the device driver.

So it should just unconditionally work. It is actually looks like a
bug that we were blocking detach on these paths since the attach was
unconditional and the caller is going to free the (probably) UNAMANGED
domain once this returns.

The only place we should be testing for deferred attach is during the
initial point the dma device is linked to the group, and then again
during the dma api calls to check if the device

This maybe the patch that is needed to explain this:

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index d69ebba81bebd8..06f1fe6563bb30 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -993,8 +993,8 @@ int iommu_group_add_device(struct iommu_group *group, struct device *dev)
 
 	mutex_lock(&group->mutex);
 	list_add_tail(&device->list, &group->devices);
-	if (group->domain  && !iommu_is_attach_deferred(dev))
-		ret = __iommu_attach_device(group->domain, dev);
+	if (group->domain)
+		ret = iommu_group_do_dma_first_attach(dev, group->domain);
 	mutex_unlock(&group->mutex);
 	if (ret)
 		goto err_put_group;
@@ -1760,21 +1760,24 @@ static void probe_alloc_default_domain(struct bus_type *bus,
 
 }
 
-static int iommu_group_do_dma_attach(struct device *dev, void *data)
+static int iommu_group_do_dma_first_attach(struct device *dev, void *data)
 {
 	struct iommu_domain *domain = data;
-	int ret = 0;
 
-	if (!iommu_is_attach_deferred(dev))
-		ret = __iommu_attach_device(domain, dev);
+	lockdep_assert_held(&dev->iommu_group->mutex);
 
-	return ret;
+	if (iommu_is_attach_deferred(dev)) {
+		dev->iommu->attach_deferred = 1;
+		return 0;
+	}
+
+	return __iommu_attach_device(domain, dev);
 }
 
-static int __iommu_group_dma_attach(struct iommu_group *group)
+static int __iommu_group_dma_first_attach(struct iommu_group *group)
 {
 	return __iommu_group_for_each_dev(group, group->default_domain,
-					  iommu_group_do_dma_attach);
+					  iommu_group_do_dma_first_attach);
 }
 
 static int iommu_group_do_probe_finalize(struct device *dev, void *data)
@@ -1839,7 +1842,7 @@ int bus_iommu_probe(struct bus_type *bus)
 
 		iommu_group_create_direct_mappings(group);
 
-		ret = __iommu_group_dma_attach(group);
+		ret = __iommu_group_dma_first_attach(group);
 
 		mutex_unlock(&group->mutex);
 
@@ -1971,9 +1974,11 @@ static int __iommu_attach_device(struct iommu_domain *domain,
 		return -ENODEV;
 
 	ret = domain->ops->attach_dev(domain, dev);
-	if (!ret)
-		trace_attach_device_to_domain(dev);
-	return ret;
+	if (ret)
+		return ret;
+	dev->iommu->attach_deferred = 0;
+	trace_attach_device_to_domain(dev);
+	return 0;
 }
 
 /**
@@ -2018,7 +2023,7 @@ EXPORT_SYMBOL_GPL(iommu_attach_device);
 
 int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain)
 {
-	if (iommu_is_attach_deferred(dev))
+	if (dev->iommu && dev->iommu->attach_deferred)
 		return __iommu_attach_device(domain, dev);
 
 	return 0;
@@ -2027,9 +2032,6 @@ int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain)
 static void __iommu_detach_device(struct iommu_domain *domain,
 				  struct device *dev)
 {
-	if (iommu_is_attach_deferred(dev))
-		return;
-
 	domain->ops->detach_dev(domain, dev);
 	trace_detach_device_from_domain(dev);
 }
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 1690c334e51631..ebac04a13fff68 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -413,6 +413,7 @@ struct dev_iommu {
 	struct iommu_device		*iommu_dev;
 	void				*priv;
 	u32				max_pasids;
+	u8				attach_deferred;
 };
 
 int iommu_device_register(struct iommu_device *iommu,



  reply	other threads:[~2022-11-28 14:57 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-28  6:46 [PATCH v3 00/20] iommu: Retire detach_dev callback Lu Baolu
2022-11-28  6:46 ` [PATCH v3 01/20] iommu/amd: Remove " Lu Baolu
2022-11-28 13:42   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 02/20] iommu/apple-dart: " Lu Baolu
2022-11-28 13:43   ` Jason Gunthorpe
2022-11-30 17:00   ` Sven Peter
2022-12-01  4:50     ` Baolu Lu
2022-11-28  6:46 ` [PATCH v3 03/20] iommu/qcom: " Lu Baolu
2022-11-28 13:43   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 04/20] iommu/exynos: " Lu Baolu
2022-11-28 13:44   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 05/20] iommu/ipmmu: " Lu Baolu
2022-11-28 13:44   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 06/20] iommu/mtk: " Lu Baolu
2022-11-28 13:49   ` Jason Gunthorpe
2022-11-28 13:59     ` Robin Murphy
2022-11-29  2:07       ` Baolu Lu
2022-11-29 11:45         ` Robin Murphy
2022-11-29 11:58           ` Baolu Lu
2022-11-28  6:46 ` [PATCH v3 07/20] iommu/rockchip: " Lu Baolu
2022-11-28 13:53   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 08/20] iommu/sprd: " Lu Baolu
2022-11-28 13:53   ` Jason Gunthorpe
2022-11-29  3:34   ` Tian, Kevin
2022-11-30  9:02     ` Chunyan Zhang
2022-11-30  9:03   ` Chunyan Zhang
2022-11-28  6:46 ` [PATCH v3 09/20] iommu/sun50i: " Lu Baolu
2022-11-28 14:09   ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 10/20] iommu: Add set_platform_dma iommu ops Lu Baolu
2022-11-28 14:11   ` Jason Gunthorpe
2022-11-29  2:15     ` Baolu Lu
2022-11-28  6:46 ` [PATCH v3 11/20] iommu/fsl_pamu: Add set_platform_dma callback Lu Baolu
2022-11-28 14:14   ` Jason Gunthorpe
2022-11-29  3:46     ` Baolu Lu
2022-11-28  6:46 ` [PATCH v3 12/20] iommu/msm: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 13/20] iommu/mtk_v1: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 14/20] iommu/omap: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 15/20] iommu/s390: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 16/20] iommu/gart: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 17/20] iommu/tegra: " Lu Baolu
2022-11-28  6:46 ` [PATCH v3 18/20] iommu: Call set_platform_dma if default domain is unavailable Lu Baolu
2022-11-28 14:57   ` Jason Gunthorpe [this message]
2023-01-03  2:45     ` Baolu Lu
2023-01-03 14:25       ` Jason Gunthorpe
2022-11-28  6:46 ` [PATCH v3 19/20] iommu: Retire detach_dev callback Lu Baolu
2022-11-28  6:46 ` [PATCH v3 20/20] iommu: Rename attach_dev to set_dev Lu Baolu
2022-11-28 13:41   ` Robin Murphy
2022-11-28 15:00     ` Jason Gunthorpe
2022-11-28 15:53       ` Robin Murphy
2022-11-29  3:59         ` Tian, Kevin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y4TMQ7HazPWMdsNj@nvidia.com \
    --to=jgg@nvidia.com \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=baolu.lu@linux.intel.com \
    --cc=hch@infradead.org \
    --cc=heiko@sntech.de \
    --cc=iommu@lists.linux.dev \
    --cc=jean-philippe@linaro.org \
    --cc=joro@8bytes.org \
    --cc=kevin.tian@intel.com \
    --cc=krzysztof.kozlowski@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=marcan@marcan.st \
    --cc=matthias.bgg@gmail.com \
    --cc=mjrosato@linux.ibm.com \
    --cc=orsonzhai@gmail.com \
    --cc=robdclark@gmail.com \
    --cc=robin.murphy@arm.com \
    --cc=suravee.suthikulpanit@amd.com \
    --cc=sven@svenpeter.dev \
    --cc=thierry.reding@gmail.com \
    --cc=wens@csie.org \
    --cc=will@kernel.org \
    --cc=yong.wu@mediatek.com \
    --cc=zhang.lyra@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).