[PATCH v7 13/15] iommu/amd: Use the generic iommu page table
Vasant Hegde
vasant.hegde at amd.com
Thu Oct 30 03:22:40 PDT 2025
On 10/23/2025 11:50 PM, Jason Gunthorpe wrote:
> From: Alejandro Jimenez <alejandro.j.jimenez at oracle.com>
>
> Replace the io_pgtable versions with pt_iommu versions. The v2 page table
> uses the x86 implementation that will be eventually shared with VT-d.
>
> This supports the same special features as the original code:
> - increase_top for the v1 format to allow scaling from 3 to 6 levels
> - non-present flushing
> - Dirty tracking for v1 only
> - __sme_set() to adjust the PTEs for CC
> - Optimization for flushing with virtualization to minimize the range
> - amd_iommu_pgsize_bitmap override of the native page sizes
> - page tables allocate from the device's NUMA node
>
> Rework the domain ops so that v1/v2 get their own ops. Make dedicated
> allocation functions for v1 and v2. Hook up invalidation for a top change
> to struct pt_iommu_flush_ops. Delete some of the iopgtable related code
> that becomes unused in this patch. The next patch will delete the rest of
> it.
>
> This fixes a race bug in AMD's increase_address_space() implementation. It
> stores the top level and top pointer in different memory, which prevents
> other threads from reading a coherent version:
>
> increase_address_space() alloc_pte()
> level = pgtable->mode - 1;
> pgtable->root = pte;
> pgtable->mode += 1;
> pte = &pgtable->root[PM_LEVEL_INDEX(level, address)];
>
> The iommupt version is careful to put mode and root under a single
> READ_ONCE and then is careful to only READ_ONCE a single time per
> walk.
>
> Signed-off-by: Alejandro Jimenez <alejandro.j.jimenez at oracle.com>
> Tested-by: Alejandro Jimenez <alejandro.j.jimenez at oracle.com>
> Signed-off-by: Jason Gunthorpe <jgg at nvidia.com>
I have reviewed and done some testing. Looks good to me.
Reviewed-by: Vasant Hegde <vasant.hegde at amd.com>
-Vasant
More information about the linux-riscv
mailing list