[PATCH v3 6/7] drm/amdgpu: Skip dma map resource for null RDMA device

Christian König christian.koenig at amd.com
Mon Apr 22 14:56:32 UTC 2024


Am 22.04.24 um 15:57 schrieb Philip Yang:
> To test RDMA using dummy driver on the system without NIC/RDMA
> device, the get/put dma pages pass in null device pointer, skip the
> dma map/unmap resource and sg table to avoid null pointer access.

Well that is completely illegal and would break IOMMU.

Why does the RDMA driver does that in the first place?

Regards,
Christian.

>
> Signed-off-by: Philip Yang <Philip.Yang at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 33 +++++++++++---------
>   1 file changed, 19 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> index 9fe56a21ef88..0caf2c89ef1d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
> @@ -705,12 +705,15 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
>   		unsigned long size = min(cursor.size, MAX_SG_SEGMENT_SIZE);
>   		dma_addr_t addr;
>   
> -		addr = dma_map_resource(dev, phys, size, dir,
> -					DMA_ATTR_SKIP_CPU_SYNC);
> -		r = dma_mapping_error(dev, addr);
> -		if (r)
> -			goto error_unmap;
> -
> +		if (dev) {
> +			addr = dma_map_resource(dev, phys, size, dir,
> +						DMA_ATTR_SKIP_CPU_SYNC);
> +			r = dma_mapping_error(dev, addr);
> +			if (r)
> +				goto error_unmap;
> +		} else {
> +			addr = phys;
> +		}
>   		sg_set_page(sg, NULL, size, 0);
>   		sg_dma_address(sg) = addr;
>   		sg_dma_len(sg) = size;
> @@ -724,10 +727,10 @@ int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
>   	for_each_sgtable_sg((*sgt), sg, i) {
>   		if (!sg->length)
>   			continue;
> -
> -		dma_unmap_resource(dev, sg->dma_address,
> -				   sg->length, dir,
> -				   DMA_ATTR_SKIP_CPU_SYNC);
> +		if (dev)
> +			dma_unmap_resource(dev, sg->dma_address,
> +					   sg->length, dir,
> +					   DMA_ATTR_SKIP_CPU_SYNC);
>   	}
>   	sg_free_table(*sgt);
>   
> @@ -752,10 +755,12 @@ void amdgpu_vram_mgr_free_sgt(struct device *dev,
>   	struct scatterlist *sg;
>   	int i;
>   
> -	for_each_sgtable_sg(sgt, sg, i)
> -		dma_unmap_resource(dev, sg->dma_address,
> -				   sg->length, dir,
> -				   DMA_ATTR_SKIP_CPU_SYNC);
> +	if (dev) {
> +		for_each_sgtable_sg(sgt, sg, i)
> +			dma_unmap_resource(dev, sg->dma_address,
> +					   sg->length, dir,
> +					   DMA_ATTR_SKIP_CPU_SYNC);
> +	}
>   	sg_free_table(sgt);
>   	kfree(sgt);
>   }



More information about the amd-gfx mailing list