]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu: Fix ATS invalidation timeouts during __iommu_remove_group_pasid()
authorNicolin Chen <nicolinc@nvidia.com>
Sat, 25 Apr 2026 01:15:25 +0000 (18:15 -0700)
committerJoerg Roedel <joerg.roedel@amd.com>
Mon, 11 May 2026 08:12:44 +0000 (10:12 +0200)
If a device is blocked, its PASID domains are already detached. Repeating
iommu_remove_dev_pasid() is unnecessary and might trigger ATS invalidation
timeouts.

Skip the iommu_remove_dev_pasid() call upon gdev->blocked.

Fixes: c279e83953d9 ("iommu: Introduce pci_dev_reset_iommu_prepare/done()")
Cc: stable@vger.kernel.org
Closes: https://sashiko.dev/#/patchset/20260407194644.171304-1-nicolinc%40nvidia.com
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/iommu.c

index 301c76c40e3d0bb703284f1eb63fb8ec28bf192d..a5e3e90883f84fced3c69c1754ef6b79fabacc92 100644 (file)
@@ -3602,7 +3602,12 @@ static void __iommu_remove_group_pasid(struct iommu_group *group,
        struct group_device *device;
 
        for_each_group_device(group, device) {
-               if (device->dev->iommu->max_pasids > 0)
+               /*
+                * A group-level detach cannot fail, even if there is a blocked
+                * device. In fact, blocked devices must be already detached for
+                * a pending device recovery.
+                */
+               if (!device->blocked && device->dev->iommu->max_pasids > 0)
                        iommu_remove_dev_pasid(device->dev, pasid, domain);
        }
 }