From: Baolu Lu <baolu.lu@linux.intel.com>
To: Yi Liu <yi.l.liu@intel.com>,
joro@8bytes.org, jgg@nvidia.com, kevin.tian@intel.com
Cc: baolu.lu@linux.intel.com, alex.williamson@redhat.com,
eric.auger@redhat.com, nicolinc@nvidia.com,
chao.p.peng@linux.intel.com, iommu@lists.linux.dev,
zhenzhong.duan@intel.com, linux-kselftest@vger.kernel.org,
vasant.hegde@amd.com
Subject: Re: [PATCH v2 3/6] iommu/vt-d: Make intel_iommu_set_dev_pasid() to handle domain replacement
Date: Fri, 13 Sep 2024 09:35:21 +0800 [thread overview]
Message-ID: <a2cbc96f-7be3-4f70-a38b-540eddfd7c23@linux.intel.com> (raw)
In-Reply-To: <20240912130427.10119-4-yi.l.liu@intel.com>
On 9/12/24 9:04 PM, Yi Liu wrote:
> set_dev_pasid op is going to support domain replacement and keep the old
> hardware config if it fails. Make the Intel iommu driver be prepared for
> it.
>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> ---
> drivers/iommu/intel/iommu.c | 98 ++++++++++++++++++++++++-------------
> 1 file changed, 65 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
> index 80b587de226d..6f5a8e549f3f 100644
> --- a/drivers/iommu/intel/iommu.c
> +++ b/drivers/iommu/intel/iommu.c
> @@ -4248,8 +4248,8 @@ static int intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
> return 0;
> }
>
> -static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
> - struct iommu_domain *domain)
> +static void domain_remove_dev_pasid(struct iommu_domain *domain,
> + struct device *dev, ioasid_t pasid)
> {
> struct device_domain_info *info = dev_iommu_priv_get(dev);
> struct dev_pasid_info *curr, *dev_pasid = NULL;
> @@ -4257,11 +4257,6 @@ static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
> struct dmar_domain *dmar_domain;
> unsigned long flags;
>
> - if (domain->type == IOMMU_DOMAIN_IDENTITY) {
> - intel_pasid_tear_down_entry(iommu, dev, pasid, 0);
> - return;
> - }
> -
> dmar_domain = to_dmar_domain(domain);
> spin_lock_irqsave(&dmar_domain->lock, flags);
> list_for_each_entry(curr, &dmar_domain->dev_pasids, link_domain) {
> @@ -4278,13 +4273,24 @@ static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
> domain_detach_iommu(dmar_domain, iommu);
> intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
> kfree(dev_pasid);
> +}
> +
> +static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
> + struct iommu_domain *domain)
> +{
> + struct device_domain_info *info = dev_iommu_priv_get(dev);
> + struct intel_iommu *iommu = info->iommu;
> +
> intel_pasid_tear_down_entry(iommu, dev, pasid,
> INTEL_PASID_TEARDOWN_DRAIN_PRQ);
> + if (domain->type == IOMMU_DOMAIN_IDENTITY)
> + return;
The static identity domain is not capable of handling page requests.
Therefore there is no need to drain PRQ for an identity domain removal.
So it probably should be something like this:
if (domain->type == IOMMU_DOMAIN_IDENTITY) {
intel_pasid_tear_down_entry(iommu, dev, pasid, 0);
return;
}
intel_pasid_tear_down_entry(iommu, dev, pasid,
INTEL_PASID_TEARDOWN_DRAIN_PRQ);
> + domain_remove_dev_pasid(domain, dev, pasid);
> }
>
> -static int intel_iommu_set_dev_pasid(struct iommu_domain *domain,
> - struct device *dev, ioasid_t pasid,
> - struct iommu_domain *old)
> +static struct dev_pasid_info *
> +domain_prepare_dev_pasid(struct iommu_domain *domain,
> + struct device *dev, ioasid_t pasid)
Why do you want to return a struct pointer instead of an integer? The
returned pointer is not used after it is returned.
Also, how about renaming this helper to domain_add_dev_pasid() to pair
it with domain_remove_dev_pasid()?
> {
> struct device_domain_info *info = dev_iommu_priv_get(dev);
> struct dmar_domain *dmar_domain = to_dmar_domain(domain);
> @@ -4293,22 +4299,13 @@ static int intel_iommu_set_dev_pasid(struct iommu_domain *domain,
> unsigned long flags;
> int ret;
>
> - if (!pasid_supported(iommu) || dev_is_real_dma_subdevice(dev))
> - return -EOPNOTSUPP;
> -
> - if (domain->dirty_ops)
> - return -EINVAL;
> -
> - if (context_copied(iommu, info->bus, info->devfn))
> - return -EBUSY;
> -
> ret = prepare_domain_attach_device(domain, dev);
> if (ret)
> - return ret;
> + return ERR_PTR(ret);
>
> dev_pasid = kzalloc(sizeof(*dev_pasid), GFP_KERNEL);
> if (!dev_pasid)
> - return -ENOMEM;
> + return ERR_PTR(-ENOMEM);
>
> ret = domain_attach_iommu(dmar_domain, iommu);
> if (ret)
Thanks,
baolu
next prev parent reply other threads:[~2024-09-13 1:39 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-12 13:04 [PATCH v2 0/6] Make set_dev_pasid op supporting domain replacement Yi Liu
2024-09-12 13:04 ` [PATCH v2 1/6] iommu: Pass old domain to set_dev_pasid op Yi Liu
2024-09-26 19:04 ` Jason Gunthorpe
2024-09-30 7:11 ` Tian, Kevin
2024-09-12 13:04 ` [PATCH v2 2/6] iommu/vt-d: Move intel_drain_pasid_prq() into intel_pasid_tear_down_entry() Yi Liu
2024-09-12 13:22 ` Baolu Lu
2024-09-13 12:10 ` Yi Liu
2024-09-13 2:11 ` Baolu Lu
2024-09-13 12:11 ` Yi Liu
2024-09-30 7:15 ` Tian, Kevin
2024-09-12 13:04 ` [PATCH v2 3/6] iommu/vt-d: Make intel_iommu_set_dev_pasid() to handle domain replacement Yi Liu
2024-09-13 1:35 ` Baolu Lu [this message]
2024-09-13 2:17 ` Baolu Lu
2024-09-13 12:18 ` Yi Liu
2024-09-30 7:19 ` Tian, Kevin
2024-10-09 1:09 ` Baolu Lu
2024-10-11 5:01 ` Tian, Kevin
2024-09-13 12:17 ` Yi Liu
2024-09-13 1:42 ` Baolu Lu
2024-09-13 12:21 ` Yi Liu
2024-09-14 1:03 ` Baolu Lu
2024-09-14 3:03 ` Liu, Yi L
2024-09-12 13:04 ` [PATCH v2 4/6] iommu/vt-d: Add set_dev_pasid callback for nested domain Yi Liu
2024-09-13 1:52 ` Baolu Lu
2024-09-13 12:22 ` Yi Liu
2024-09-30 7:19 ` Tian, Kevin
2024-09-12 13:04 ` [PATCH v2 5/6] iommu/arm-smmu-v3: Make smmuv3 set_dev_pasid() op support replace Yi Liu
2024-09-30 7:20 ` Tian, Kevin
2024-10-15 8:43 ` Will Deacon
2024-10-15 10:03 ` Yi Liu
2024-10-15 16:27 ` Jason Gunthorpe
2024-09-12 13:04 ` [PATCH v2 6/6] iommu: Make set_dev_pasid op support domain replacement Yi Liu
2024-09-26 19:06 ` Jason Gunthorpe
2024-09-30 7:20 ` 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=a2cbc96f-7be3-4f70-a38b-540eddfd7c23@linux.intel.com \
--to=baolu.lu@linux.intel.com \
--cc=alex.williamson@redhat.com \
--cc=chao.p.peng@linux.intel.com \
--cc=eric.auger@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=linux-kselftest@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=vasant.hegde@amd.com \
--cc=yi.l.liu@intel.com \
--cc=zhenzhong.duan@intel.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).