From: Nicolin Chen <nicolinc@nvidia.com>
To: "jgg@nvidia.com" <jgg@nvidia.com>, "Tian, Kevin" <kevin.tian@intel.com>
Cc: "Liu, Yi L" <yi.l.liu@intel.com>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v2 3/3] iommufd/device: Change iommufd_hw_pagetable_has_group to device centric
Date: Mon, 30 Jan 2023 02:22:17 -0800 [thread overview]
Message-ID: <Y9eaLpD1XIvE/3Nh@Asurada-Nvidia> (raw)
In-Reply-To: <Y9ZMulxEyGvnvW0X@Asurada-Nvidia>
On Sun, Jan 29, 2023 at 02:38:55AM -0800, Nicolin Chen wrote:
> > > @@ -385,10 +372,8 @@ void iommufd_device_detach(struct
> > > iommufd_device *idev)
> > > struct iommufd_hw_pagetable *hwpt = idev->hwpt;
> > >
> > > mutex_lock(&hwpt->ioas->mutex);
> > > - mutex_lock(&hwpt->devices_lock);
> > > refcount_dec(hwpt->devices_users);
> > > - list_del(&idev->devices_item);
> > > - if (!iommufd_hw_pagetable_has_group(hwpt, idev->group)) {
> > > + if (iommufd_hw_pagetable_has_device(hwpt, idev->dev)) {
> > > if (refcount_read(hwpt->devices_users) == 1) {
> > > iopt_table_remove_domain(&hwpt->ioas->iopt,
> > > hwpt->domain);
> > > @@ -397,7 +382,6 @@ void iommufd_device_detach(struct iommufd_device
> > > *idev)
> > > iommu_detach_group(hwpt->domain, idev->group);
> > > }
> >
> > emmm how do we track last device detach in a group? Here the first
> > device detach already leads to group detach...
>
> Oh no. That's a bug. Thanks for catching it.
>
> We need an additional refcount somewhere to track the number of
> attached devices in the iommu_group.
Wondering if we can let iommu_attach/detach_device handle this:
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index d0d7c2177ad6..b38f71e92e2a 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -57,6 +57,7 @@ struct iommu_group {
struct iommu_domain *domain;
struct list_head entry;
unsigned int owner_cnt;
+ unsigned int attached_cnt;
void *owner;
};
@@ -64,6 +65,7 @@ struct group_device {
struct list_head list;
struct device *dev;
char *name;
+ bool attached;
};
struct iommu_group_attribute {
@@ -2035,6 +2037,7 @@ static int __iommu_attach_device(struct iommu_domain *domain,
*/
int iommu_attach_device(struct iommu_domain *domain, struct device *dev)
{
+ struct group_device *grp_dev;
struct iommu_group *group;
int ret;
@@ -2042,16 +2045,22 @@ int iommu_attach_device(struct iommu_domain *domain, struct device *dev)
if (!group)
return -ENODEV;
- /*
- * Lock the group to make sure the device-count doesn't
- * change while we are attaching
- */
mutex_lock(&group->mutex);
- ret = -EINVAL;
- if (iommu_group_device_count(group) != 1)
+
+ list_for_each_entry(grp_dev, &group->devices, list)
+ if (grp_dev->dev == dev)
+ break;
+ if (grp_dev->attached)
goto out_unlock;
- ret = __iommu_attach_group(domain, group);
+ /* Attach the group when attaching the first device in the group */
+ if (group->attached_cnt == 0) {
+ ret = __iommu_attach_group(domain, group);
+ if (ret)
+ goto out_unlock;
+ }
+ grp_dev->attached = true;
+ group->attached_cnt++;
out_unlock:
mutex_unlock(&group->mutex);
@@ -2071,6 +2080,7 @@ int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain)
void iommu_detach_device(struct iommu_domain *domain, struct device *dev)
{
+ struct group_device *grp_dev;
struct iommu_group *group;
group = iommu_group_get(dev);
@@ -2078,10 +2088,20 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev)
return;
mutex_lock(&group->mutex);
- if (WARN_ON(domain != group->domain) ||
- WARN_ON(iommu_group_device_count(group) != 1))
+ if (WARN_ON(domain != group->domain))
goto out_unlock;
- __iommu_group_set_core_domain(group);
+
+ list_for_each_entry(grp_dev, &group->devices, list)
+ if (grp_dev->dev == dev)
+ break;
+ if (!grp_dev->attached)
+ goto out_unlock;
+
+ grp_dev->attached = false;
+ group->attached_cnt--;
+ /* Detach the group when detaching the last device in the group */
+ if (group->attached_cnt == 0)
+ __iommu_group_set_core_domain(group);
out_unlock:
mutex_unlock(&group->mutex);
next prev parent reply other threads:[~2023-01-30 10:22 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-28 21:18 [PATCH v2 0/3] iommufd: Remove iommufd_hw_pagetable_has_group Nicolin Chen
2023-01-28 21:18 ` [PATCH v2 1/3] iommufd: Add devices_users to track the hw_pagetable usage by device Nicolin Chen
2023-01-29 9:23 ` Tian, Kevin
2023-01-29 9:30 ` Nicolin Chen
2023-01-29 9:39 ` Tian, Kevin
2023-01-30 2:22 ` Liu, Yi L
2023-01-30 15:02 ` Jason Gunthorpe
2023-01-30 19:27 ` Nicolin Chen
2023-01-30 19:50 ` Jason Gunthorpe
2023-01-30 20:04 ` Nicolin Chen
2023-01-30 20:35 ` Jason Gunthorpe
2023-01-30 20:53 ` Nicolin Chen
2023-02-01 7:48 ` Nicolin Chen
2023-02-02 9:12 ` Nicolin Chen
2023-02-07 4:19 ` Liu, Yi L
2023-02-01 6:57 ` Nicolin Chen
2023-02-01 7:56 ` Nicolin Chen
2023-02-01 15:53 ` Jason Gunthorpe
2023-02-01 17:46 ` Nicolin Chen
2023-02-01 18:37 ` Jason Gunthorpe
2023-02-01 19:25 ` Nicolin Chen
2023-02-01 20:00 ` Jason Gunthorpe
2023-02-01 21:18 ` Nicolin Chen
2023-02-02 7:28 ` Nicolin Chen
2023-02-02 15:03 ` Jason Gunthorpe
2023-02-07 4:27 ` Liu, Yi L
2023-01-28 21:18 ` [PATCH v2 2/3] iommufd/device: Make hwpt_list list_add/del symmetric Nicolin Chen
2023-01-29 9:24 ` Tian, Kevin
2023-01-29 9:31 ` Nicolin Chen
2023-01-30 14:59 ` Jason Gunthorpe
2023-01-30 19:03 ` Nicolin Chen
2023-01-30 19:07 ` Jason Gunthorpe
2023-01-30 19:38 ` Nicolin Chen
2023-01-28 21:18 ` [PATCH v2 3/3] iommufd/device: Change iommufd_hw_pagetable_has_group to device centric Nicolin Chen
2023-01-29 9:37 ` Tian, Kevin
2023-01-29 10:38 ` Nicolin Chen
2023-01-30 0:44 ` Tian, Kevin
2023-01-30 10:22 ` Nicolin Chen [this message]
2023-02-01 3:07 ` Tian, Kevin
2023-02-01 6:49 ` Baolu Lu
2023-02-01 6:59 ` Tian, Kevin
2023-02-01 7:20 ` Nicolin Chen
2023-02-02 6:32 ` Tian, Kevin
2023-02-02 6:36 ` Nicolin Chen
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=Y9eaLpD1XIvE/3Nh@Asurada-Nvidia \
--to=nicolinc@nvidia.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=kevin.tian@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=yi.l.liu@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.