]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu: Pass old domain to set_dev_pasid op
authorYi Liu <yi.l.liu@intel.com>
Fri, 8 Nov 2024 02:13:52 +0000 (10:13 +0800)
committerJoerg Roedel <jroedel@suse.de>
Fri, 8 Nov 2024 13:04:49 +0000 (14:04 +0100)
To support domain replacement for pasid, the underlying iommu driver needs
to know the old domain hence be able to clean up the existing attachment.
It would be much convenient for iommu layer to pass down the old domain.
Otherwise, iommu drivers would need to track domain for pasids by
themselves, this would duplicate code among the iommu drivers. Or iommu
drivers would rely group->pasid_array to get domain, which may not always
the correct one.

Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Reviewed-by: Lu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20241107122234.7424-2-yi.l.liu@intel.com
Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/amd_iommu.h
drivers/iommu/amd/pasid.c
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c
drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c
drivers/iommu/intel/iommu.c
drivers/iommu/intel/svm.c
drivers/iommu/iommu.c
include/linux/iommu.h

index 6386fa4556d9b8060544264d98b6af30c8d4de46..b11b014fa82d18d6bfcb1b6a4d74d6e5a2d77f96 100644 (file)
@@ -52,7 +52,8 @@ struct iommu_domain *amd_iommu_domain_alloc_sva(struct device *dev,
                                                struct mm_struct *mm);
 void amd_iommu_domain_free(struct iommu_domain *dom);
 int iommu_sva_set_dev_pasid(struct iommu_domain *domain,
-                           struct device *dev, ioasid_t pasid);
+                           struct device *dev, ioasid_t pasid,
+                           struct iommu_domain *old);
 void amd_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
                                struct iommu_domain *domain);
 
index 0657b9373be5475fdcd765048d3f359106fd8b2b..d1dfc745f55e3e4da864a3d24397c42724f69cc6 100644 (file)
@@ -100,7 +100,8 @@ static const struct mmu_notifier_ops sva_mn = {
 };
 
 int iommu_sva_set_dev_pasid(struct iommu_domain *domain,
-                           struct device *dev, ioasid_t pasid)
+                           struct device *dev, ioasid_t pasid,
+                           struct iommu_domain *old)
 {
        struct pdom_dev_data *pdom_dev_data;
        struct protection_domain *sva_pdom = to_pdomain(domain);
index a7c36654dee5a504835faa95be65d8be102f8675..645da7b69bedfeff70c72e01d8e2073dfc20a65e 100644 (file)
@@ -332,7 +332,8 @@ void arm_smmu_sva_notifier_synchronize(void)
 }
 
 static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain,
-                                     struct device *dev, ioasid_t id)
+                                     struct device *dev, ioasid_t id,
+                                     struct iommu_domain *old)
 {
        struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
        struct arm_smmu_master *master = dev_iommu_priv_get(dev);
index 737c5b88235510e3ddb91a28cecbdcdc14854b32..1517fe2c356e7cac41709a3c5021d96e9d3ebac5 100644 (file)
@@ -2856,7 +2856,8 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
 }
 
 static int arm_smmu_s1_set_dev_pasid(struct iommu_domain *domain,
-                                     struct device *dev, ioasid_t id)
+                                    struct device *dev, ioasid_t id,
+                                    struct iommu_domain *old)
 {
        struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain);
        struct arm_smmu_master *master = dev_iommu_priv_get(dev);
index e2b3aa60119125cc4bfadcd4f1076d39162e7cdf..2d1d208d512586a7c907f964944edce11854157b 100644 (file)
@@ -4070,7 +4070,8 @@ static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid,
 }
 
 static int intel_iommu_set_dev_pasid(struct iommu_domain *domain,
-                                    struct device *dev, ioasid_t pasid)
+                                    struct device *dev, ioasid_t pasid,
+                                    struct iommu_domain *old)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
@@ -4356,7 +4357,8 @@ static int identity_domain_attach_dev(struct iommu_domain *domain, struct device
 }
 
 static int identity_domain_set_dev_pasid(struct iommu_domain *domain,
-                                        struct device *dev, ioasid_t pasid)
+                                        struct device *dev, ioasid_t pasid,
+                                        struct iommu_domain *old)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct intel_iommu *iommu = info->iommu;
index 3cc43a958b4dc7774eda98d1001f8072f22644ad..4a2bd65614ad2d45e11adc11f6721065b3b8fe0f 100644 (file)
@@ -111,7 +111,8 @@ static const struct mmu_notifier_ops intel_mmuops = {
 };
 
 static int intel_svm_set_dev_pasid(struct iommu_domain *domain,
-                                  struct device *dev, ioasid_t pasid)
+                                  struct device *dev, ioasid_t pasid,
+                                  struct iommu_domain *old)
 {
        struct device_domain_info *info = dev_iommu_priv_get(dev);
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
index 83c8e617a2c5888e4264bd715e23904edd252f86..f3f81c04b8fbfceed66ac6620740ef87e527924d 100644 (file)
@@ -3331,7 +3331,8 @@ static int __iommu_set_group_pasid(struct iommu_domain *domain,
        int ret;
 
        for_each_group_device(group, device) {
-               ret = domain->ops->set_dev_pasid(domain, device->dev, pasid);
+               ret = domain->ops->set_dev_pasid(domain, device->dev,
+                                                pasid, NULL);
                if (ret)
                        goto err_revert;
        }
index bd722f473635209d5751dc716462feb816e74e85..32dce80aa7fd048cd893df4c51b641c85a0f99a2 100644 (file)
@@ -642,7 +642,7 @@ struct iommu_ops {
 struct iommu_domain_ops {
        int (*attach_dev)(struct iommu_domain *domain, struct device *dev);
        int (*set_dev_pasid)(struct iommu_domain *domain, struct device *dev,
-                            ioasid_t pasid);
+                            ioasid_t pasid, struct iommu_domain *old);
 
        int (*map_pages)(struct iommu_domain *domain, unsigned long iova,
                         phys_addr_t paddr, size_t pgsize, size_t pgcount,