Re: [PATCH v2 1/7] iommu: Do not call pci_dev_reset_iommu_done() unless reset succeeds
From: Nicolin Chen
Date: Wed Mar 18 2026 - 16:17:14 EST
On Wed, Mar 18, 2026 at 07:21:53AM +0000, Tian, Kevin wrote:
> > From: Nicolin Chen <nicolinc@xxxxxxxxxx>
> > Sent: Wednesday, March 18, 2026 3:16 AM
> >
> > @@ -977,7 +978,15 @@ int pci_dev_acpi_reset(struct pci_dev *dev, bool
> > probe)
> > ret = -ENOTTY;
> > }
> >
> > - pci_dev_reset_iommu_done(dev);
> > + /*
> > + * The reset might be invoked to recover a serious error. E.g. when
> > the
> > + * ATC failed to invalidate its stale entries, which can result in data
> > + * corruption. Thus, do not unblock ATS until a successful reset.
> > + */
> > + if (!ret || !pci_ats_supported(dev))
> > + pci_dev_reset_iommu_done(dev);
> > + else
> > + pci_warn(dev, "Reset failed. Blocking ATS to protect
> > memory\n");
> > return ret;
>
> let's pass the reset status to pci_dev_reset_iommu_done() then
> put above detail inside.
Yea, that's cleaner. I will make a change:
@@ -4014,7 +4014,7 @@ EXPORT_SYMBOL_GPL(pci_dev_reset_iommu_prepare);
* Note that, although unlikely, there is a risk that re-attaching domains might
* fail due to some unexpected happening like OOM.
*/
-void pci_dev_reset_iommu_done(struct pci_dev *pdev)
+void pci_dev_reset_iommu_done(struct pci_dev *pdev, bool reset_succeeds)
{
struct iommu_group *group = pdev->dev.iommu_group;
const struct iommu_ops *ops;
@@ -4025,6 +4025,11 @@ void pci_dev_reset_iommu_done(struct pci_dev *pdev)
return;
ops = dev_iommu_ops(&pdev->dev);
+ if (!reset_succeeds) {
+ pci_err(pdev, "Reset failed. Blocking ATS to protect memory\n");
+ return;
+ }
+
guard(mutex)(&group->mutex);
/* pci_dev_reset_iommu_prepare() was bypassed for the device */
Thanks
Nicolin