net: hns3: use dma_zalloc_coherent instead of kzalloc/dma_map_single
authorHuazhong Tan <tanhuazhong@huawei.com>
Mon, 2 Jul 2018 07:50:25 +0000 (15:50 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 2 Jul 2018 13:49:14 +0000 (22:49 +0900)
Reference to Documentation/DMA-API-HOWTO.txt,
Streaming DMA mappings which are usually mapped for one DMA transfer,
Network card DMA ring descriptors should use Consistent DMA mappings.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c

index beca364..8fce363 100644 (file)
@@ -1780,33 +1780,27 @@ static void hns3_free_buffers(struct hns3_enet_ring *ring)
 /* free desc along with its attached buffer */
 static void hns3_free_desc(struct hns3_enet_ring *ring)
 {
+       int size = ring->desc_num * sizeof(ring->desc[0]);
+
        hns3_free_buffers(ring);
 
-       dma_unmap_single(ring_to_dev(ring), ring->desc_dma_addr,
-                        ring->desc_num * sizeof(ring->desc[0]),
-                        DMA_BIDIRECTIONAL);
-       ring->desc_dma_addr = 0;
-       kfree(ring->desc);
-       ring->desc = NULL;
+       if (ring->desc) {
+               dma_free_coherent(ring_to_dev(ring), size,
+                                 ring->desc, ring->desc_dma_addr);
+               ring->desc = NULL;
+       }
 }
 
 static int hns3_alloc_desc(struct hns3_enet_ring *ring)
 {
        int size = ring->desc_num * sizeof(ring->desc[0]);
 
-       ring->desc = kzalloc(size, GFP_KERNEL);
+       ring->desc = dma_zalloc_coherent(ring_to_dev(ring), size,
+                                        &ring->desc_dma_addr,
+                                        GFP_KERNEL);
        if (!ring->desc)
                return -ENOMEM;
 
-       ring->desc_dma_addr = dma_map_single(ring_to_dev(ring), ring->desc,
-                                            size, DMA_BIDIRECTIONAL);
-       if (dma_mapping_error(ring_to_dev(ring), ring->desc_dma_addr)) {
-               ring->desc_dma_addr = 0;
-               kfree(ring->desc);
-               ring->desc = NULL;
-               return -ENOMEM;
-       }
-
        return 0;
 }
 
index db80485..82cf12a 100644 (file)
@@ -45,31 +45,24 @@ static int hclge_alloc_cmd_desc(struct hclge_cmq_ring *ring)
 {
        int size  = ring->desc_num * sizeof(struct hclge_desc);
 
-       ring->desc = kzalloc(size, GFP_KERNEL);
+       ring->desc = dma_zalloc_coherent(cmq_ring_to_dev(ring),
+                                        size, &ring->desc_dma_addr,
+                                        GFP_KERNEL);
        if (!ring->desc)
                return -ENOMEM;
 
-       ring->desc_dma_addr = dma_map_single(cmq_ring_to_dev(ring), ring->desc,
-                                            size, DMA_BIDIRECTIONAL);
-       if (dma_mapping_error(cmq_ring_to_dev(ring), ring->desc_dma_addr)) {
-               ring->desc_dma_addr = 0;
-               kfree(ring->desc);
-               ring->desc = NULL;
-               return -ENOMEM;
-       }
-
        return 0;
 }
 
 static void hclge_free_cmd_desc(struct hclge_cmq_ring *ring)
 {
-       dma_unmap_single(cmq_ring_to_dev(ring), ring->desc_dma_addr,
-                        ring->desc_num * sizeof(ring->desc[0]),
-                        DMA_BIDIRECTIONAL);
+       int size  = ring->desc_num * sizeof(struct hclge_desc);
 
-       ring->desc_dma_addr = 0;
-       kfree(ring->desc);
-       ring->desc = NULL;
+       if (ring->desc) {
+               dma_free_coherent(cmq_ring_to_dev(ring), size,
+                                 ring->desc, ring->desc_dma_addr);
+               ring->desc = NULL;
+       }
 }
 
 static int hclge_alloc_cmd_queue(struct hclge_dev *hdev, int ring_type)
index 1bbfe13..fb471fe 100644 (file)
@@ -76,32 +76,24 @@ static int hclgevf_alloc_cmd_desc(struct hclgevf_cmq_ring *ring)
 {
        int size = ring->desc_num * sizeof(struct hclgevf_desc);
 
-       ring->desc = kzalloc(size, GFP_KERNEL);
+       ring->desc = dma_zalloc_coherent(cmq_ring_to_dev(ring),
+                                        size, &ring->desc_dma_addr,
+                                        GFP_KERNEL);
        if (!ring->desc)
                return -ENOMEM;
 
-       ring->desc_dma_addr = dma_map_single(cmq_ring_to_dev(ring), ring->desc,
-                                            size, DMA_BIDIRECTIONAL);
-
-       if (dma_mapping_error(cmq_ring_to_dev(ring), ring->desc_dma_addr)) {
-               ring->desc_dma_addr = 0;
-               kfree(ring->desc);
-               ring->desc = NULL;
-               return -ENOMEM;
-       }
-
        return 0;
 }
 
 static void hclgevf_free_cmd_desc(struct hclgevf_cmq_ring *ring)
 {
-       dma_unmap_single(cmq_ring_to_dev(ring), ring->desc_dma_addr,
-                        ring->desc_num * sizeof(ring->desc[0]),
-                        hclgevf_ring_to_dma_dir(ring));
+       int size  = ring->desc_num * sizeof(struct hclgevf_desc);
 
-       ring->desc_dma_addr = 0;
-       kfree(ring->desc);
-       ring->desc = NULL;
+       if (ring->desc) {
+               dma_free_coherent(cmq_ring_to_dev(ring), size,
+                                 ring->desc, ring->desc_dma_addr);
+               ring->desc = NULL;
+       }
 }
 
 static int hclgevf_init_cmd_queue(struct hclgevf_dev *hdev,