This splits the preparation works of the iommu and the Intel iommu driver out from the iommufd pasid attach/replace series. [1] To support domain replacement, the definition of the set_dev_pasid op needs to be enhanced. Meanwhile, the existing set_dev_pasid callbacks should be extended as well to suit the new definition. This series first passes the old domain to the set_dev_pasid op, and prepares the Intel iommu set_dev_pasid callbacks (paging domain, identity domain, and sva domain) for the new definition, add the missing set_dev_pasid callback for the nested domain, makes ARM SMMUv3 set_dev_pasid op to suit the new set_dev_pasid op definition, and in the end, claims the set_dev_pasid op support domain replacement. The AMD set_dev_pasid callback is extended to fail if the caller tries to do the domain replacement to meet the new definition of set_dev_pasid op. AMD iommu driver would support it later per Vasant [2]. [1] https://lore.kernel.org/linux-iommu/20240412081516.31168-1-yi.l.liu@xxxxxxxxx/ [2] https://lore.kernel.org/linux-iommu/fa9c4fc3-9365-465e-8926-b4d2d6361b9c@xxxxxxx/ This is based on Joerg's next branch. Base commit: 75bc266cd1a6 v6: - Fix a 0day compiling issue (Baolu) - Refine the pasid replace helpers to compose new pasid entry and do a full copy instead of setting each fields in the pasid entry from the pasid table. This avoids transit the existing pasid entry multiple times. (Baolu) v5: https://lore.kernel.org/linux-iommu/20241106154606.9564-1-yi.l.liu@xxxxxxxxx/ - Drop the nonsense function description in patch 02 of v4 (Kevin, Baulu) - Add the error message as the setup helpers in replace helpers (Kevin) - Check old domain id with the domain id in pasid entry within the replace helpers. Along with it, iommu_domain_did() is added (Kevin, Baolu) - Merge patch 05 and 09 of v4 and name the patch as consolidating the dev_pasid_info add/remove (Baolu) - Drop patch 10 of v4, hence patch 09 of v5 (Baolu, Kevin, Jason) - Add r-b tags from Baolu, Kevin, Vasant - Rebase on top of Joerg's next tree (75bc266cd1a6) v4: https://lore.kernel.org/linux-iommu/20241104131842.13303-1-yi.l.liu@xxxxxxxxx/ - Fix a missing input argument modification in patch 01 (Nicolin) - Per Baolu's suggestion, this series does not extend the pasid setup helpers to handle domain replacement, instead it adds pasid replace helpers, hence drop patch 02 of v3 as it is no longer required in this series. - Add a new helper to consolidate the cache flush for the modifications to a present pasid entry (the fields other than P and SSADE) (Baolu) - Update the set_dev_pasid op of intel identity domain to handle replacement - Consolidate the dev_pasid_info code of intel_svm_set_dev_pasid() - Add a separate set_dev_pasid callback for nested domain instead of sharing intel_iommu_set_dev_pasid() (Baolu) - Drop patch 05 of v3 as Baolu has another patch that touches it. v3: https://lore.kernel.org/linux-iommu/20241018055402.23277-1-yi.l.liu@xxxxxxxxx/ - Add Kevin and Jason's r-b to patch 01, 02, 04, 05 and 06 of v2 - Add back the patch 03 of v1 to make the pasid setup helpers do all the pasid entry modification, hence the set_dev_pasid path is really rollback-less, which is spotted by Baolu. - Rename prepare_domain_attach_device() (Baolu) - Use unsigned int instead of u32 for flags (Baolu) - Remove a stale comment in arm_smmu_set_pasid (Will) v2: https://lore.kernel.org/linux-iommu/20240912130427.10119-1-yi.l.liu@xxxxxxxxx/ - Make ARM SMMUv3 set_dev_pasid op support domain replacement (Jason) - Drop patch 03 of v1 (Kevin) - Multiple tweaks in VT-d driver (Kevin) v1: https://lore.kernel.org/linux-iommu/20240628085538.47049-1-yi.l.liu@xxxxxxxxx/ Regards, Yi Liu Jason Gunthorpe (1): iommu/arm-smmu-v3: Make set_dev_pasid() op support replace Yi Liu (12): iommu: Pass old domain to set_dev_pasid op iommu/vt-d: Add a helper to flush cache for updating present pasid entry iommu/vt-d: Refactor the pasid setup helpers iommu/vt-d: Add pasid replace helpers iommu/vt-d: Consolidate the struct dev_pasid_info add/remove iommu/vt-d: Add iommu_domain_did() to get did iommu/vt-d: Make intel_iommu_set_dev_pasid() to handle domain replacement iommu/vt-d: Limit intel_iommu_set_dev_pasid() for paging domain iommu/vt-d: Make intel_svm_set_dev_pasid() support domain replacement iommu/vt-d: Make identity_domain_set_dev_pasid() to handle domain replacement iommu/vt-d: Add set_dev_pasid callback for nested domain iommu: Make set_dev_pasid op support domain replacement drivers/iommu/amd/amd_iommu.h | 3 +- drivers/iommu/amd/pasid.c | 6 +- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 5 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 12 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 2 +- drivers/iommu/intel/iommu.c | 174 +++++--- drivers/iommu/intel/iommu.h | 34 ++ drivers/iommu/intel/nested.c | 50 +++ drivers/iommu/intel/pasid.c | 389 ++++++++++++++---- drivers/iommu/intel/pasid.h | 22 +- drivers/iommu/intel/svm.c | 36 +- drivers/iommu/iommu.c | 3 +- include/linux/iommu.h | 5 +- 13 files changed, 574 insertions(+), 167 deletions(-) -- 2.34.1