[PATCH 1/3] drm/amdgpu: Add userptr bo support for mGPUs when iommu is on

Felix Kuehling felix.kuehling at amd.com
Wed Apr 5 20:25:56 UTC 2023


On 2023-04-05 11:31, Shane Xiao wrote:
> For userptr bo with iommu on, multiple GPUs use same system
> memory dma mapping address when both adev and bo_adev are in
> identity mode or in the same iommu group.
>
> If RAM direct map to one GPU, other GPUs can share the original
> BO in order to reduce dma address array usage when RAM can
> direct map to these GPUs. However, we should explicit check
> whether RAM can direct map to all these GPUs.
>
> This patch fixes a potential issue that where RAM is
> direct mapped on some but not all GPUs.
>
> v2:
>    1. Update comment
>    2. Add helper function reuse_dmamap
>
> Signed-off-by: Shane Xiao <shane.xiao at amd.com>

Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>


> ---
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 27 ++++++++++++++++---
>   1 file changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index e7403f8e4eba..2fbb9db64ad5 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -81,6 +81,25 @@ static bool kfd_mem_is_attached(struct amdgpu_vm *avm,
>   	return false;
>   }
>   
> +/**
> + * reuse_dmamap() - Check whether adev can share the original
> + * userptr BO
> + *
> + * If both adev and bo_adev are in direct mapping or
> + * in the same iommu group, they can share the original BO.
> + *
> + * @adev: Device to which can or cannot share the original BO
> + * @bo_adev: Device to which allocated BO belongs to
> + *
> + * Return: returns true if adev can share original userptr BO,
> + * false otherwise.
> + */
> +static bool reuse_dmamap(struct amdgpu_device *adev, struct amdgpu_device *bo_adev)
> +{
> +	return (adev->ram_is_direct_mapped && bo_adev->ram_is_direct_mapped) ||
> +			(adev->dev->iommu_group == bo_adev->dev->iommu_group);
> +}
> +
>   /* Set memory usage limits. Current, limits are
>    *  System (TTM + userptr) memory - 15/16th System RAM
>    *  TTM memory - 3/8th System RAM
> @@ -804,11 +823,11 @@ static int kfd_mem_attach(struct amdgpu_device *adev, struct kgd_mem *mem,
>   			 va + bo_size, vm);
>   
>   		if ((adev == bo_adev && !(mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_MMIO_REMAP)) ||
> -		    (amdgpu_ttm_tt_get_usermm(mem->bo->tbo.ttm) && adev->ram_is_direct_mapped) ||
> -		    same_hive) {
> +		    (amdgpu_ttm_tt_get_usermm(mem->bo->tbo.ttm) && reuse_dmamap(adev, bo_adev)) ||
> +			same_hive) {
>   			/* Mappings on the local GPU, or VRAM mappings in the
> -			 * local hive, or userptr mapping IOMMU direct map mode
> -			 * share the original BO
> +			 * local hive, or userptr mapping can reuse dma map
> +			 * address space share the original BO
>   			 */
>   			attachment[i]->type = KFD_MEM_ATT_SHARED;
>   			bo[i] = mem->bo;


More information about the amd-gfx mailing list