]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net: hns3: stop napi polling when HNS3_NIC_STATE_DOWN is set
authorHuazhong Tan <tanhuazhong@huawei.com>
Fri, 9 Nov 2018 14:07:52 +0000 (22:07 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 10 Nov 2018 00:47:35 +0000 (16:47 -0800)
When calling napi_disable during reset down process, if NAPIF_STATE_MISSED
is set, napi_complete will call __napi_schedule to do the polling again.
So this patch uses HNS3_NIC_STATE_DOWN to ensure the polling is not
scheduled again.

Also, when napi_complete returns true, it means polling is scheduled
again, it is not neccssary to enable the interrupt.

Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

index 183fd8344b80a1371a4ad506ad8cda7bf55234ad..499032bba70584b92b147c8e00f180df7227a5c7 100644 (file)
@@ -415,9 +415,6 @@ static void hns3_nic_net_down(struct net_device *netdev)
        const struct hnae3_ae_ops *ops;
        int i;
 
-       if (test_and_set_bit(HNS3_NIC_STATE_DOWN, &priv->state))
-               return;
-
        /* disable vectors */
        for (i = 0; i < priv->vector_num; i++)
                hns3_vector_disable(&priv->tqp_vector[i]);
@@ -439,6 +436,11 @@ static void hns3_nic_net_down(struct net_device *netdev)
 
 static int hns3_nic_net_stop(struct net_device *netdev)
 {
+       struct hns3_nic_priv *priv = netdev_priv(netdev);
+
+       if (test_and_set_bit(HNS3_NIC_STATE_DOWN, &priv->state))
+               return 0;
+
        netif_tx_stop_all_queues(netdev);
        netif_carrier_off(netdev);
 
@@ -2699,6 +2701,7 @@ static void hns3_update_new_int_gl(struct hns3_enet_tqp_vector *tqp_vector)
 
 static int hns3_nic_common_poll(struct napi_struct *napi, int budget)
 {
+       struct hns3_nic_priv *priv = netdev_priv(napi->dev);
        struct hns3_enet_ring *ring;
        int rx_pkt_total = 0;
 
@@ -2707,6 +2710,11 @@ static int hns3_nic_common_poll(struct napi_struct *napi, int budget)
        bool clean_complete = true;
        int rx_budget;
 
+       if (unlikely(test_bit(HNS3_NIC_STATE_DOWN, &priv->state))) {
+               napi_complete(napi);
+               return 0;
+       }
+
        /* Since the actual Tx work is minimal, we can give the Tx a larger
         * budget and be more aggressive about cleaning up the Tx descriptors.
         */
@@ -2731,9 +2739,11 @@ static int hns3_nic_common_poll(struct napi_struct *napi, int budget)
        if (!clean_complete)
                return budget;
 
-       napi_complete(napi);
-       hns3_update_new_int_gl(tqp_vector);
-       hns3_mask_vector_irq(tqp_vector, 1);
+       if (likely(!test_bit(HNS3_NIC_STATE_DOWN, &priv->state)) &&
+           napi_complete(napi)) {
+               hns3_update_new_int_gl(tqp_vector);
+               hns3_mask_vector_irq(tqp_vector, 1);
+       }
 
        return rx_pkt_total;
 }