From: Yi Liu <yi.l.liu@intel.com>
To: "Tian, Kevin" <kevin.tian@intel.com>,
"joro@8bytes.org" <joro@8bytes.org>,
"jgg@nvidia.com" <jgg@nvidia.com>,
"baolu.lu@linux.intel.com" <baolu.lu@linux.intel.com>
Cc: "alex.williamson@redhat.com" <alex.williamson@redhat.com>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"eric.auger@redhat.com" <eric.auger@redhat.com>,
"nicolinc@nvidia.com" <nicolinc@nvidia.com>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"chao.p.peng@linux.intel.com" <chao.p.peng@linux.intel.com>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
"Duan, Zhenzhong" <zhenzhong.duan@intel.com>,
"linux-kselftest@vger.kernel.org"
<linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v3 1/7] iommu: Introduce a replace API for device pasid
Date: Fri, 16 Aug 2024 17:43:18 +0800 [thread overview]
Message-ID: <1a825f1b-be9d-4de1-948a-be0cce3175be@intel.com> (raw)
In-Reply-To: <BN9PR11MB5276B4AF6321A083C3C2D2648CAC2@BN9PR11MB5276.namprd11.prod.outlook.com>
On 2024/7/18 16:27, Tian, Kevin wrote:
>> From: Liu, Yi L <yi.l.liu@intel.com>
>> Sent: Friday, June 28, 2024 5:06 PM
>>
>> @@ -3289,7 +3290,20 @@ static int __iommu_set_group_pasid(struct
>> iommu_domain *domain,
>>
>> if (device == last_gdev)
>> break;
>> - ops->remove_dev_pasid(device->dev, pasid, domain);
>> + /* If no old domain, undo the succeeded devices/pasid */
>> + if (!old) {
>> + ops->remove_dev_pasid(device->dev, pasid, domain);
>> + continue;
>> + }
>> +
>> + /*
>> + * Rollback the succeeded devices/pasid to the old domain.
>> + * And it is a driver bug to fail attaching with a previously
>> + * good domain.
>> + */
>> + if (WARN_ON(old->ops->set_dev_pasid(old, device->dev,
>> + pasid, domain)))
>> + ops->remove_dev_pasid(device->dev, pasid, domain);
>
> I wonder whether @remove_dev_pasid() can be replaced by having
> blocking_domain support @set_dev_pasid?
how about your thought, @Jason?
>> +int iommu_replace_device_pasid(struct iommu_domain *domain,
>> + struct device *dev, ioasid_t pasid)
>> +{
>> + /* Caller must be a probed driver on dev */
>> + struct iommu_group *group = dev->iommu_group;
>> + void *curr;
>> + int ret;
>> +
>> + if (!domain->ops->set_dev_pasid)
>> + return -EOPNOTSUPP;
>> +
>> + if (!group)
>> + return -ENODEV;
>> +
>> + if (!dev_has_iommu(dev) || dev_iommu_ops(dev) != domain-
>>> owner ||
>> + pasid == IOMMU_NO_PASID)
>> + return -EINVAL;
>> +
>> + mutex_lock(&group->mutex);
>> + /*
>> + * The recorded domain is inconsistent with the domain pasid is
>> + * actually attached until pasid is attached to the new domain.
>> + * This has race condition with the paths that do not hold
>> + * group->mutex. E.g. the Page Request forwarding.
>> + */
>
> so?
This is added per the below comment. Maybe I should have made it clearer.
Due to the order of this xa operations, the domain in the xarray does not
match the actual translation structure, but it will become consistent in
the end.
https://lore.kernel.org/linux-iommu/20240429135512.GC941030@nvidia.com/
>> + curr = xa_store(&group->pasid_array, pasid, domain, GFP_KERNEL);
>> + if (!curr) {
>> + xa_erase(&group->pasid_array, pasid);
>> + ret = -EINVAL;
>> + goto out_unlock;
>> + }
>> +
>> + ret = xa_err(curr);
>> + if (ret)
>> + goto out_unlock;
>> +
>> + if (curr == domain)
>> + goto out_unlock;
>> +
>> + ret = __iommu_set_group_pasid(domain, group, pasid, curr);
>> + if (ret)
>> + WARN_ON(domain != xa_store(&group->pasid_array, pasid,
>> + curr, GFP_KERNEL));
>
> above can follow Jason's suggestion to iommu_group_replace_domain ()
> in Baolu's series, i.e. doing a xa_reserve() first.
yeah, I noticed it. But there is a minor difference. In Baolu's series
no need to retrieve the old domain, but this path needs to get it and
pass it to set_dev_pasid().
--
Regards,
Yi Liu
next prev parent reply other threads:[~2024-08-16 9:39 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-28 9:05 [PATCH v3 0/7] iommufd support pasid attach/replace Yi Liu
2024-06-28 9:05 ` [PATCH v3 1/7] iommu: Introduce a replace API for device pasid Yi Liu
2024-07-18 8:27 ` Tian, Kevin
2024-08-16 9:43 ` Yi Liu [this message]
2024-08-16 13:02 ` Jason Gunthorpe
2024-09-06 4:21 ` Yi Liu
2024-09-06 4:33 ` Baolu Lu
2024-09-06 5:57 ` Yi Liu
2024-06-28 9:05 ` [PATCH v3 2/7] iommufd: Pass pasid through the device attach/replace path Yi Liu
2024-06-28 9:05 ` [PATCH v3 3/7] iommufd: Support attach/replace hwpt per pasid Yi Liu
2024-06-28 9:05 ` [PATCH v3 4/7] iommufd/selftest: Add set_dev_pasid and remove_dev_pasid in mock iommu Yi Liu
2024-06-28 9:05 ` [PATCH v3 5/7] iommufd/selftest: Add a helper to get test device Yi Liu
2024-06-28 9:05 ` [PATCH v3 6/7] iommufd/selftest: Add test ops to test pasid attach/detach Yi Liu
2024-06-28 9:05 ` [PATCH v3 7/7] iommufd/selftest: Add coverage for iommufd " Yi Liu
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=1a825f1b-be9d-4de1-948a-be0cce3175be@intel.com \
--to=yi.l.liu@intel.com \
--cc=alex.williamson@redhat.com \
--cc=baolu.lu@linux.intel.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=kvm@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=robin.murphy@arm.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