Am 23.04.24 um 15:04 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 just to make it clear this patch is really a no-go for upstreaming.

The RDMA code isn't upstream as far as I know and doing this here is really not a good idea even internally.

Regards,
Christian.


Signed-off-by: Philip Yang <philip.y...@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 6c7133bf51d8..101a85263b53 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
@@ -698,12 +698,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;
@@ -717,10 +720,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);
@@ -745,10 +748,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);
  }

Reply via email to