[PATCH v8 00/14] Update SMMUv3 to the modern iommu API (part 2b/3)

Jerry Snitselaar jsnitsel at redhat.com
Mon Jun 24 15:00:44 PDT 2024


On Mon, Jun 03, 2024 at 09:15:45PM GMT, Jason Gunthorpe wrote:
> Continuing the work of part 1 and 2a this part focuses on the PASID and
> SVA code bringing these functional improvements:
> 
>  - attach_dev failure does not change the HW configuration.
> 
>  - Full PASID API support including:
>     - S1/SVA domains attached to PASIDs
>     - IDENTITY/BLOCKED/S1 attached to RID
>     - Change of the RID domain while PASIDs are attached
> 
>  - Streamlined SVA support using the core infrastructure
> 
>  - Hitless, whenever possible, change between two domains
> 
> This requires some reorganizing how the invalidation is tracked, a
> flexible linked list containing the SSIDs as well as the ATC information
> is used instead of a single master.
> 
> The revised invalidation infrastructure is used to build generic support
> for attaching any sort of domain to any SSID, including the necessary
> maintenance of the invalidation list and the global ATS state. This
> mechansim is used again in part 3 as part of the nesting series.
> 
> The ATS ordering is generalized and consolidated so that the PASID flow
> can use it and put into a form where it is fully hitless, whenever
> possible. This is necessary as changes to single PASIDs or RIDs can not
> change global state like ATS without impacting other, still attached,
> PASIDs or RIDs.
> 
> Next simply replace the entire outdated SVA mmu_notifier implementation in
> one shot and switch it over to the newly created generic PASID layer and
> generic invalidation logic. This avoids the messy and confusing approach
> of trying to incrementally untangle this in place. The new code is small
> and simple enough this is much better than trying to figure out smaller
> steps.
> 
> Once SVA is resting on the consolidate PASID layer it is straightforward
> to make the PASID interface functionally complete by supporting S1DSS to
> allow concurrent change of the RID while a PASID is attached and allow
> supporting PASID over an IDENTIY RID.
> 
> This continues to support lazy allocation and installation of the CD table
> by continuing to use the CFG mode for IDENTITY/BLOCKED when when the PASID
> table is empty.
> 
> Finally enable attaching any S1 domain to a PASID, not just SVA.
> 
> It achieves the same goals as the several series from Michael and the
> S1DSS series from Nicolin that were trying to improve portions of the API.
> 
> This is on github:
> https://github.com/jgunthorpe/linux/commits/smmuv3_newapi
> 
> v8:
>  - Rebase on v6.10-rc2
>  - Make arm_smmu_sva_domain_alloc NULL when SVA is disabled so the core
>    code sees a NULL function pointer
>  - Update comments around arm_smmu_attach_prepare()
>  - Rename struct attach_state -> arm_smmu_attach_state and document
>    better, include more common function paramters in state
>  - Consistently use ats_enabled everywhere, replacing disable_ats in state
>  - Move the note about ATS bypass/abort to arm_smmu_attach_prepare()
>  - Remove temporary cd_table.in_ste check in arm_smmu_sva_set_dev_pasid()
>  - Improve comments and clarity of logic in arm_smmu_attach_commit()
>  - Shorten arm_smmu_mmu_notifier_free()
>  - Fix domain -> sid_domain typo in arm_smmu_remove_dev_pasid()
> v7: https://lore.kernel.org/r/0-v7-9597c885796c+d2-smmuv3_newapi_p2b_jgg@nvidia.com
>  - Second half of the split series
>  - Rebase on Joerg's latest
>  - Accommodate ARM_SMMU_FEAT_ATTR_TYPES_OVR for the S1DSS code
>  - Include the S1DSS kunit tests
>  - Include hunks to adjust the unit tests to API changes from this series
>  - Move 3 BTM related patches out of this series, they can go in the BTM
>    enablement series.
>  - Move the domain_alloc_sva() conversion to the first patch, and rebase
>    on the accepted core code change
>  - Use the new core APIs for the PASID ops
>  - Revise commit messages
> v6: https://lore.kernel.org/r/0-v6-228e7adf25eb+4155-smmuv3_newapi_p2_jgg@nvidia.com
> 
> Cc: Nicolin Chen <nicolinc at nvidia.com>
> Cc: Michael Shavit <mshavit at google.com>
> Cc: Jean-Philippe Brucker <jean-philippe at linaro.org>
> Cc: Shameerali Kolothum Thodi <shameerali.kolothum.thodi at huawei.com>
> Cc: Eric Auger <eric.auger at redhat.com>
> Cc: Moritz Fischer <mdf at kernel.org>
> Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
> 
> Jason Gunthorpe (14):
>   iommu/arm-smmu-v3: Convert to domain_alloc_sva()
>   iommu/arm-smmu-v3: Start building a generic PASID layer
>   iommu/arm-smmu-v3: Make smmu_domain->devices into an allocated list
>   iommu/arm-smmu-v3: Make changing domains be hitless for ATS
>   iommu/arm-smmu-v3: Add ssid to struct arm_smmu_master_domain
>   iommu/arm-smmu-v3: Do not use master->sva_enable to restrict attaches
>   iommu/arm-smmu-v3: Thread SSID through the arm_smmu_attach_*()
>     interface
>   iommu/arm-smmu-v3: Make SVA allocate a normal arm_smmu_domain
>   iommu/arm-smmu-v3: Keep track of arm_smmu_master_domain for SVA
>   iommu/arm-smmu-v3: Put the SVA mmu notifier in the smmu_domain
>   iommu/arm-smmu-v3: Allow IDENTITY/BLOCKED to be set while PASID is
>     used
>   iommu/arm-smmu-v3: Test the STE S1DSS functionality
>   iommu/arm-smmu-v3: Allow a PASID to be set when RID is
>     IDENTITY/BLOCKED
>   iommu/arm-smmu-v3: Allow setting a S1 domain to a PASID
> 
>  .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c   | 431 +++-----------
>  .../iommu/arm/arm-smmu-v3/arm-smmu-v3-test.c  | 116 +++-
>  drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c   | 561 ++++++++++++++----
>  drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h   |  52 +-
>  4 files changed, 664 insertions(+), 496 deletions(-)
> 
> 
> base-commit: c3f38fa61af77b49866b006939479069cd451173
> -- 
> 2.45.2
> 

Reviewed-by: Jerry Snitselaar <jsnitsel at redhat.com>




More information about the linux-arm-kernel mailing list