RDMA/mlx5: Use PCI device for dma mappings
authorParav Pandit <parav@nvidia.com>
Wed, 25 Nov 2020 06:46:28 +0000 (08:46 +0200)
committerJason Gunthorpe <jgg@nvidia.com>
Thu, 26 Nov 2020 19:49:05 +0000 (15:49 -0400)
DMA operation of the IB device is done using ib_device->dma_device.

Instead of accessing parent of the IB device, use the PCI dma device which
is setup to ib_device->dma_device during IB device registration.

Link: https://lore.kernel.org/r/20201125064628.8431-1-leon@kernel.org
Signed-off-by: Parav Pandit <parav@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/mlx5/mr.c

index b091d84ba4359aa7c574ac5eeb9fedb236a6af17..b6116f6d065de3b356cb5a1429aecc2de3943c79 100644 (file)
@@ -1075,7 +1075,7 @@ static void *mlx5_ib_create_xlt_wr(struct mlx5_ib_mr *mr,
                                   unsigned int flags)
 {
        struct mlx5_ib_dev *dev = mr->dev;
-       struct device *ddev = dev->ib_dev.dev.parent;
+       struct device *ddev = &dev->mdev->pdev->dev;
        dma_addr_t dma;
        void *xlt;
 
@@ -1112,7 +1112,7 @@ static void *mlx5_ib_create_xlt_wr(struct mlx5_ib_mr *mr,
 static void mlx5_ib_unmap_free_xlt(struct mlx5_ib_dev *dev, void *xlt,
                                   struct ib_sge *sg)
 {
-       struct device *ddev = dev->ib_dev.dev.parent;
+       struct device *ddev = &dev->mdev->pdev->dev;
 
        dma_unmap_single(ddev, sg->addr, sg->length, DMA_TO_DEVICE);
        mlx5_ib_free_xlt(xlt, sg->length);
@@ -1137,7 +1137,7 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,
                       int page_shift, int flags)
 {
        struct mlx5_ib_dev *dev = mr->dev;
-       struct device *ddev = dev->ib_dev.dev.parent;
+       struct device *ddev = &dev->mdev->pdev->dev;
        void *xlt;
        struct mlx5_umr_wr wr;
        struct ib_sge sg;
@@ -1216,7 +1216,7 @@ int mlx5_ib_update_xlt(struct mlx5_ib_mr *mr, u64 idx, int npages,
 static int mlx5_ib_update_mr_pas(struct mlx5_ib_mr *mr, unsigned int flags)
 {
        struct mlx5_ib_dev *dev = mr->dev;
-       struct device *ddev = dev->ib_dev.dev.parent;
+       struct device *ddev = &dev->mdev->pdev->dev;
        struct ib_block_iter biter;
        struct mlx5_mtt *cur_mtt;
        struct mlx5_umr_wr wr;
@@ -1733,6 +1733,8 @@ mlx5_alloc_priv_descs(struct ib_device *device,
                      int ndescs,
                      int desc_size)
 {
+       struct mlx5_ib_dev *dev = to_mdev(device);
+       struct device *ddev = &dev->mdev->pdev->dev;
        int size = ndescs * desc_size;
        int add_size;
        int ret;
@@ -1745,9 +1747,8 @@ mlx5_alloc_priv_descs(struct ib_device *device,
 
        mr->descs = PTR_ALIGN(mr->descs_alloc, MLX5_UMR_ALIGN);
 
-       mr->desc_map = dma_map_single(device->dev.parent, mr->descs,
-                                     size, DMA_TO_DEVICE);
-       if (dma_mapping_error(device->dev.parent, mr->desc_map)) {
+       mr->desc_map = dma_map_single(ddev, mr->descs, size, DMA_TO_DEVICE);
+       if (dma_mapping_error(ddev, mr->desc_map)) {
                ret = -ENOMEM;
                goto err;
        }
@@ -1765,9 +1766,10 @@ mlx5_free_priv_descs(struct mlx5_ib_mr *mr)
        if (mr->descs) {
                struct ib_device *device = mr->ibmr.device;
                int size = mr->max_descs * mr->desc_size;
+               struct mlx5_ib_dev *dev = to_mdev(device);
 
-               dma_unmap_single(device->dev.parent, mr->desc_map,
-                                size, DMA_TO_DEVICE);
+               dma_unmap_single(&dev->mdev->pdev->dev, mr->desc_map, size,
+                                DMA_TO_DEVICE);
                kfree(mr->descs_alloc);
                mr->descs = NULL;
        }