liquidio: fix tx completions in napi poll
authorVSR Burru <veerasenareddy.burru@cavium.com>
Wed, 22 Mar 2017 18:54:50 +0000 (11:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Mar 2017 02:36:44 +0000 (19:36 -0700)
If there are no egress packets pending, then don't look for tx completions
in napi poll.  Also, fix broken tx queue wakeup logic.

Signed-off-by: VSR Burru <veerasenareddy.burru@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: Satanand Burla <satananda.burla@cavium.com>
Signed-off-by: Derek Chickles <derek.chickles@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cavium/liquidio/lio_main.c
drivers/net/ethernet/cavium/liquidio/lio_vf_main.c

index 86ea86cfc1336664e7ecd8480be74b2af099596c..10732e0e48cfb08aeec04e9b7b7eac7cbd09d0a0 100644 (file)
@@ -932,14 +932,13 @@ static void update_txq_status(struct octeon_device *oct, int iq_num)
                        INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num,
                                                  tx_restart, 1);
                        netif_wake_subqueue(netdev, iq->q_index);
-               } else {
-                       if (!octnet_iq_is_full(oct, lio->txq)) {
-                               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
-                                                         lio->txq,
-                                                         tx_restart, 1);
-                               wake_q(netdev, lio->txq);
-                       }
                }
+       } else if (netif_queue_stopped(netdev) &&
+                  lio->linfo.link.s.link_up &&
+                  (!octnet_iq_is_full(oct, lio->txq))) {
+               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
+                                         lio->txq, tx_restart, 1);
+               netif_wake_queue(netdev);
        }
 }
 
@@ -2454,8 +2453,11 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
        /* Flush the instruction queue */
        iq = oct->instr_queue[iq_no];
        if (iq) {
-               /* Process iq buffers with in the budget limits */
-               tx_done = octeon_flush_iq(oct, iq, budget);
+               if (atomic_read(&iq->instr_pending))
+                       /* Process iq buffers with in the budget limits */
+                       tx_done = octeon_flush_iq(oct, iq, budget);
+               else
+                       tx_done = 1;
                /* Update iq read-index rather than waiting for next interrupt.
                 * Return back if tx_done is false.
                 */
index 65e6f4bfa1cf1b2a2a4b2967941ecc053ff523df..68794fa5d322638ab86a24eeaef3b7e31fe51fe0 100644 (file)
@@ -687,13 +687,12 @@ static void update_txq_status(struct octeon_device *oct, int iq_num)
                        netif_wake_subqueue(netdev, iq->q_index);
                        INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev, iq_num,
                                                  tx_restart, 1);
-               } else {
-                       if (!octnet_iq_is_full(oct, lio->txq)) {
-                               INCR_INSTRQUEUE_PKT_COUNT(
-                                   lio->oct_dev, lio->txq, tx_restart, 1);
-                               wake_q(netdev, lio->txq);
-                       }
                }
+       } else if (netif_queue_stopped(netdev) && lio->linfo.link.s.link_up &&
+                  (!octnet_iq_is_full(oct, lio->txq))) {
+               INCR_INSTRQUEUE_PKT_COUNT(lio->oct_dev,
+                                         lio->txq, tx_restart, 1);
+               netif_wake_queue(netdev);
        }
 }
 
@@ -1636,8 +1635,12 @@ static int liquidio_napi_poll(struct napi_struct *napi, int budget)
        /* Flush the instruction queue */
        iq = oct->instr_queue[iq_no];
        if (iq) {
-               /* Process iq buffers with in the budget limits */
-               tx_done = octeon_flush_iq(oct, iq, budget);
+               if (atomic_read(&iq->instr_pending))
+                       /* Process iq buffers with in the budget limits */
+                       tx_done = octeon_flush_iq(oct, iq, budget);
+               else
+                       tx_done = 1;
+
                /* Update iq read-index rather than waiting for next interrupt.
                 * Return back if tx_done is false.
                 */