RDMA/hns: Use dma_alloc_coherent() instead of kmalloc/dma_map_single()
authorCai Huoqing <caihuoqing@baidu.com>
Sun, 26 Sep 2021 06:11:15 +0000 (14:11 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 12 Oct 2021 15:54:51 +0000 (12:54 -0300)
Replacing kmalloc/kfree/dma_map_single/dma_unmap_single() with
dma_alloc_coherent/dma_free_coherent() helps to reduce code size, and
simplify the code, and coherent DMA will not clear the cache every time.

The SOC that this driver supports does not have incoherent DMA, so this
makes the code follow the DMA API properly with no performance
impact. Currently there are missing dma sync calls around the DMA
transfers.

Link: https://lore.kernel.org/r/20210926061116.282-1-caihuoqing@baidu.com
Signed-off-by: Cai Huoqing <caihuoqing@baidu.com>
Reviewed-by: Wenpeng Liang <liangwenpeng@huawei.com>
Tested-by: Wenpeng Liang <liangwenpeng@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index d5f3faa1627a41c08224e0fb6fe9c31d8a1e9c13..91990fad718561778774f09a6bd8c29bad3f949f 100644 (file)
@@ -1165,32 +1165,22 @@ static int hns_roce_alloc_cmq_desc(struct hns_roce_dev *hr_dev,
 {
        int size = ring->desc_num * sizeof(struct hns_roce_cmq_desc);
 
-       ring->desc = kzalloc(size, GFP_KERNEL);
+       ring->desc = dma_alloc_coherent(hr_dev->dev, size,
+                                       &ring->desc_dma_addr, GFP_KERNEL);
        if (!ring->desc)
                return -ENOMEM;
 
-       ring->desc_dma_addr = dma_map_single(hr_dev->dev, ring->desc, size,
-                                            DMA_BIDIRECTIONAL);
-       if (dma_mapping_error(hr_dev->dev, ring->desc_dma_addr)) {
-               ring->desc_dma_addr = 0;
-               kfree(ring->desc);
-               ring->desc = NULL;
-
-               return -ENOMEM;
-       }
-
        return 0;
 }
 
 static void hns_roce_free_cmq_desc(struct hns_roce_dev *hr_dev,
                                   struct hns_roce_v2_cmq_ring *ring)
 {
-       dma_unmap_single(hr_dev->dev, ring->desc_dma_addr,
-                        ring->desc_num * sizeof(struct hns_roce_cmq_desc),
-                        DMA_BIDIRECTIONAL);
+       dma_free_coherent(hr_dev->dev,
+                         ring->desc_num * sizeof(struct hns_roce_cmq_desc),
+                         ring->desc, ring->desc_dma_addr);
 
        ring->desc_dma_addr = 0;
-       kfree(ring->desc);
 }
 
 static int init_csq(struct hns_roce_dev *hr_dev,