From: Nicolin Chen <nicolinc@nvidia.com>
To: "Tian, Kevin" <kevin.tian@intel.com>
Cc: "joro@8bytes.org" <joro@8bytes.org>,
"afael@kernel.org" <afael@kernel.org>,
"bhelgaas@google.com" <bhelgaas@google.com>,
"alex@shazbot.org" <alex@shazbot.org>,
"jgg@nvidia.com" <jgg@nvidia.com>,
"will@kernel.org" <will@kernel.org>,
"robin.murphy@arm.com" <robin.murphy@arm.com>,
"lenb@kernel.org" <lenb@kernel.org>,
"baolu.lu@linux.intel.com" <baolu.lu@linux.intel.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"iommu@lists.linux.dev" <iommu@lists.linux.dev>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"kvm@vger.kernel.org" <kvm@vger.kernel.org>,
"patches@lists.linux.dev" <patches@lists.linux.dev>,
"Jaroszynski, Piotr" <pjaroszynski@nvidia.com>,
"Sethi, Vikram" <vsethi@nvidia.com>,
"helgaas@kernel.org" <helgaas@kernel.org>,
"etzhao1900@gmail.com" <etzhao1900@gmail.com>
Subject: Re: [PATCH v5 4/5] iommu: Introduce iommu_dev_reset_prepare() and iommu_dev_reset_done()
Date: Fri, 14 Nov 2025 10:26:52 -0800 [thread overview]
Message-ID: <aRd0bIFlbRgIzGKs@Asurada-Nvidia> (raw)
In-Reply-To: <BN9PR11MB527683978D304128441125C68CCAA@BN9PR11MB5276.namprd11.prod.outlook.com>
On Fri, Nov 14, 2025 at 09:37:27AM +0000, Tian, Kevin wrote:
> > From: Nicolin Chen <nicolinc@nvidia.com>
> > @@ -2195,6 +2200,12 @@ int iommu_deferred_attach(struct device *dev,
> > struct iommu_domain *domain)
> >
> > guard(mutex)(&dev->iommu_group->mutex);
> >
> > + /*
> > + * This is a concurrent attach while a group device is resetting. Reject
> > + * it until iommu_dev_reset_done() attaches the device to group-
> > >domain.
> > + */
> > + if (dev->iommu_group->resetting_domain)
> > + return -EBUSY;
>
> It might be worth noting that failing a deferred attach leads to failing
> the dma map operation. It's different from other explicit attaching paths,
> but there is nothing more we can do here.
OK.
/*
* This is a concurrent attach while a group device is resetting. Reject
* it until iommu_dev_reset_done() attaches the device to group->domain.
*
* Worth noting that this may fail the dma map operation. But there is
* nothing more we can do here.
*/
> > @@ -2253,6 +2264,16 @@ struct iommu_domain
> > *iommu_driver_get_domain_for_dev(struct device *dev)
> >
> > lockdep_assert_held(&group->mutex);
> >
> > + /*
> > + * Driver handles the low-level __iommu_attach_device(), including
> > the
> > + * one invoked by iommu_dev_reset_done(), in which case the driver
> > must
> > + * get the resetting_domain over group->domain caching the one
> > prior to
> > + * iommu_dev_reset_prepare(), so that it wouldn't end up with
> > attaching
> > + * the device from group->domain (old) to group->domain (new).
> > + */
> > + if (group->resetting_domain)
> > + return group->resetting_domain;
>
> It's a pretty long sentence. Let's break it.
OK.
/*
* Driver handles the low-level __iommu_attach_device(), including the
* one invoked by iommu_dev_reset_done() that reattaches the device to
* the cached group->domain. In this case, the driver must get the old
* domain from group->resetting_domain rather than group->domain. This
* prevents it from reattaching the device from group->domain (old) to
* group->domain (new).
*/
>> +int iommu_dev_reset_prepare(struct device *dev)
>
> If this is intended to be used by pci for now, it's clearer to have a 'pci'
> word in the name. Later when there is a demand calling it from other
> buses, discussion will catch eyes to ensure no racy of UAF etc.
Well, if we make it exclusive for PCI. Perhaps just move these two
from pci.c to iommu.c:
int pci_reset_iommu_prepare(struct pci_dev *dev);
void pci_reset_iommu_done(struct pci_dev *dev);
> > + /*
> > + * Once the resetting_domain is set, any concurrent attachment to
> > this
> > + * iommu_group will be rejected, which would break the attach
> > routines
> > + * of the sibling devices in the same iommu_group. So, skip this case.
> > + */
> > + if (dev_is_pci(dev)) {
> > + struct group_device *gdev;
> > +
> > + for_each_group_device(group, gdev) {
> > + if (gdev->dev != dev)
> > + return 0;
> > + }
> > + }
>
> btw what'd be a real impact to reject concurrent attachment for sibling
> devices? This series already documents the impact in uAPI for the device
> under attachment, and the userspace already knows the restriction
> of devices in the group which must be attached to a same hwpt.
>
> Combining those knowledge I don't think there is a problem for
> userspace to be aware of that resetting a device in a multi-dev
> group affects concurrent attachment of sibling devices...
It's following Jason's remarks:
https://lore.kernel.org/linux-iommu/20250915125357.GH1024672@nvidia.com/
Perhaps we should add that to the uAPI, given the race condition
that you mentioned below.
> > + /* Re-attach RID domain back to group->domain */
> > + if (group->domain != group->blocking_domain) {
> > + WARN_ON(__iommu_attach_device(group->domain, dev,
> > + group->blocking_domain));
> > + }
>
> Even if we disallow resetting on a multi-dev group, there is still a
> corner case not taken care here.
>
> It's possible that there is only one device in the group at prepare,
> coming with a device hotplug added to the group in the middle,
> then doing reset_done.
>
> In this case the newly-added device will inherit the blocking domain.
>
> Then reset_done should loop all devices in the group and re-attach
> all of them to the cached domain.
Oh, that's a good catch!
I will address all of your notes.
Thank you
Nicolin
next prev parent reply other threads:[~2025-11-14 18:27 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-11 5:12 [PATCH v5 0/5] Disable ATS via iommu during PCI resets Nicolin Chen
2025-11-11 5:12 ` [PATCH v5 1/5] iommu: Lock group->mutex in iommu_deferred_attach() Nicolin Chen
2025-11-12 2:47 ` Baolu Lu
2025-11-11 5:12 ` [PATCH v5 2/5] iommu: Tiny domain for iommu_setup_dma_ops() Nicolin Chen
2025-11-12 5:22 ` Baolu Lu
2025-11-14 9:17 ` Tian, Kevin
2025-11-14 9:18 ` Tian, Kevin
2025-11-11 5:12 ` [PATCH v5 3/5] iommu: Add iommu_driver_get_domain_for_dev() helper Nicolin Chen
2025-11-12 5:58 ` Baolu Lu
2025-11-12 17:41 ` Nicolin Chen
2025-11-18 7:02 ` Nicolin Chen
2025-11-19 2:47 ` Baolu Lu
2025-11-19 2:57 ` Nicolin Chen
2025-11-24 19:16 ` Jason Gunthorpe
2025-11-12 8:52 ` kernel test robot
2025-11-14 9:18 ` Tian, Kevin
2025-11-11 5:12 ` [PATCH v5 4/5] iommu: Introduce iommu_dev_reset_prepare() and iommu_dev_reset_done() Nicolin Chen
2025-11-12 6:18 ` Baolu Lu
2025-11-12 17:43 ` Nicolin Chen
2025-11-14 9:37 ` Tian, Kevin
2025-11-14 18:26 ` Nicolin Chen [this message]
2025-11-17 4:59 ` Tian, Kevin
2025-11-17 19:27 ` Nicolin Chen
2025-11-17 23:04 ` Bjorn Helgaas
2025-11-11 5:12 ` [PATCH v5 5/5] pci: Suspend iommu function prior to resetting a device Nicolin Chen
2025-11-14 9:45 ` Tian, Kevin
2025-11-14 18:00 ` Nicolin Chen
2025-11-17 4:52 ` Tian, Kevin
2025-11-17 19:26 ` Nicolin Chen
2025-11-18 0:29 ` Tian, Kevin
2025-11-18 1:42 ` Nicolin Chen
2025-11-18 5:38 ` Baolu Lu
2025-11-18 6:53 ` Nicolin Chen
2025-11-18 7:53 ` Tian, Kevin
2025-11-18 8:17 ` Nicolin Chen
2025-11-17 22:58 ` Bjorn Helgaas
2025-11-18 8:16 ` 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=aRd0bIFlbRgIzGKs@Asurada-Nvidia \
--to=nicolinc@nvidia.com \
--cc=afael@kernel.org \
--cc=alex@shazbot.org \
--cc=baolu.lu@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=etzhao1900@gmail.com \
--cc=helgaas@kernel.org \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=pjaroszynski@nvidia.com \
--cc=robin.murphy@arm.com \
--cc=vsethi@nvidia.com \
--cc=will@kernel.org \
/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.