Patch "iommu: Undo pasid attachment only for the devices that have succeeded" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    iommu: Undo pasid attachment only for the devices that have succeeded

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     iommu-undo-pasid-attachment-only-for-the-devices-tha.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 70bcf3355de787448ef71da72825bb5ca1e250bd
Author: Yi Liu <yi.l.liu@xxxxxxxxx>
Date:   Thu Mar 28 05:29:57 2024 -0700

    iommu: Undo pasid attachment only for the devices that have succeeded
    
    [ Upstream commit b025dea63cded0d82bccd591fa105d39efc6435d ]
    
    There is no error handling now in __iommu_set_group_pasid(), it relies on
    its caller to loop all the devices to undo the pasid attachment. This is
    not self-contained and has drawbacks. It would result in unnecessary
    remove_dev_pasid() calls on the devices that have not been attached to the
    new domain. But the remove_dev_pasid() callback would get the new domain
    from the group->pasid_array. So for such devices, the iommu driver won't
    find the attachment under the domain, hence unable to do cleanup. This may
    not be a real problem today. But it depends on the implementation of the
    underlying iommu driver. e.g. the intel iommu driver would warn for such
    devices. Such warnings are unnecessary.
    
    To solve the above problem, it is necessary to handle the error within
    __iommu_set_group_pasid(). It only loops the devices that have attached
    to the new domain, and undo it.
    
    Fixes: 16603704559c ("iommu: Add attach/detach_dev_pasid iommu interfaces")
    Suggested-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
    Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
    Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx>
    Signed-off-by: Yi Liu <yi.l.liu@xxxxxxxxx>
    Reviewed-by: Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240328122958.83332-2-yi.l.liu@xxxxxxxxx
    Signed-off-by: Joerg Roedel <jroedel@xxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index a95a483def2d2..659a77f7bb833 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -3317,15 +3317,26 @@ EXPORT_SYMBOL_GPL(iommu_group_dma_owner_claimed);
 static int __iommu_set_group_pasid(struct iommu_domain *domain,
 				   struct iommu_group *group, ioasid_t pasid)
 {
-	struct group_device *device;
-	int ret = 0;
+	struct group_device *device, *last_gdev;
+	int ret;
 
 	for_each_group_device(group, device) {
 		ret = domain->ops->set_dev_pasid(domain, device->dev, pasid);
 		if (ret)
-			break;
+			goto err_revert;
 	}
 
+	return 0;
+
+err_revert:
+	last_gdev = device;
+	for_each_group_device(group, device) {
+		const struct iommu_ops *ops = dev_iommu_ops(device->dev);
+
+		if (device == last_gdev)
+			break;
+		ops->remove_dev_pasid(device->dev, pasid);
+	}
 	return ret;
 }
 
@@ -3383,10 +3394,8 @@ int iommu_attach_device_pasid(struct iommu_domain *domain,
 	}
 
 	ret = __iommu_set_group_pasid(domain, group, pasid);
-	if (ret) {
-		__iommu_remove_group_pasid(group, pasid);
+	if (ret)
 		xa_erase(&group->pasid_array, pasid);
-	}
 out_unlock:
 	mutex_unlock(&group->mutex);
 	return ret;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux