]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: hns3: fix a bug about hns3_clean_tx_ring
authorLipeng <lipeng321@huawei.com>
Mon, 23 Oct 2017 11:51:07 +0000 (19:51 +0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 24 Oct 2017 00:16:42 +0000 (01:16 +0100)
The return value of hns3_clean_tx_ring means tx ring clean result.
Return true means clean complete and there is no more pakcet need
clean. Retrun false means there is packets need clean and napi need
poll again. The last return of hns3_clean_tx_ring is
"return !!budget" as budget will decrease when clean a buffer.

If there is no valid BD in TX ring, return 0 for hns3_clean_tx_ring
will cause napi poll again and never complete the napi poll. This
patch fixes the bug.

Fixes: 327a841 (net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC)
Signed-off-by: Lipeng <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hns3_enet.h

index 06af3c86b60c393d3d440fc47ae9c2bf3f08fa71..537f6c3babb77191b81628924f55fd453a0a6e47 100644 (file)
@@ -1629,7 +1629,7 @@ static int is_valid_clean_head(struct hns3_enet_ring *ring, int h)
        return u > c ? (h > c && h <= u) : (h > c || h <= u);
 }
 
-int hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget)
+bool hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget)
 {
        struct net_device *netdev = ring->tqp->handle->kinfo.netdev;
        struct netdev_queue *dev_queue;
@@ -1640,7 +1640,7 @@ int hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget)
        rmb(); /* Make sure head is ready before touch any data */
 
        if (is_ring_empty(ring) || head == ring->next_to_clean)
-               return 0; /* no data to poll */
+               return true; /* no data to poll */
 
        if (!is_valid_clean_head(ring, head)) {
                netdev_err(netdev, "wrong head (%d, %d-%d)\n", head,
@@ -1649,7 +1649,7 @@ int hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget)
                u64_stats_update_begin(&ring->syncp);
                ring->stats.io_err_cnt++;
                u64_stats_update_end(&ring->syncp);
-               return -EIO;
+               return true;
        }
 
        bytes = 0;
index 6228b2603d9384a8c07d320b840736443662bfa6..58dc30bf893c5ece5195e4794579f93b74a18e96 100644 (file)
@@ -594,7 +594,7 @@ static inline void hns3_write_reg(void __iomem *base, u32 reg, u32 value)
 
 void hns3_ethtool_set_ops(struct net_device *netdev);
 
-int hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget);
+bool hns3_clean_tx_ring(struct hns3_enet_ring *ring, int budget);
 int hns3_init_all_ring(struct hns3_nic_priv *priv);
 int hns3_uninit_all_ring(struct hns3_nic_priv *priv);
 netdev_tx_t hns3_nic_net_xmit(struct sk_buff *skb, struct net_device *netdev);