]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i40e/i40evf: fix Tx hang workaround code
authorJesse Brandeburg <jesse.brandeburg@intel.com>
Thu, 23 Jul 2015 20:54:34 +0000 (16:54 -0400)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 10 Mar 2016 16:32:02 +0000 (08:32 -0800)
Orabug: 22342532

The arm writeback (arm_wb) code is used for kicking the Tx ring to
make sure any pending work is completed even if interrupts are
disabled. It was running when it didn't need to, and not clearing
the ring->arm_wb state after it was set.  This caused Tx hangs
to still occur occasionally when there really was no hang.
Fix this by resetting the variable right after it was used.

Change-ID: I7bf75d552ba9c4bd203d40615213861a24bb5594
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry picked from commit 0deda86836e489fe43a33e8d899319bd0ed985a4)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/intel/i40e/i40e_txrx.c
drivers/net/ethernet/intel/i40evf/i40e_txrx.c

index c8492aea792759fda02e55d51af8f15abd6b8e85..247b6bd5e0453d68f8e427a98f39431e54067dd4 100644 (file)
@@ -1844,6 +1844,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)
        i40e_for_each_ring(ring, q_vector->tx) {
                clean_complete &= i40e_clean_tx_irq(ring, vsi->work_limit);
                arm_wb |= ring->arm_wb;
+               ring->arm_wb = false;
        }
 
        /* We attempt to distribute budget to each Rx queue fairly, but don't
index 32020f8a5f84436e032f4c3eb686adecc08327fc..b1eb784fea76ad27e4a77e5f2926844e8c3a1abd 100644 (file)
@@ -254,8 +254,6 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget)
            !test_bit(__I40E_DOWN, &tx_ring->vsi->state) &&
            (I40E_DESC_UNUSED(tx_ring) != tx_ring->count))
                tx_ring->arm_wb = true;
-       else
-               tx_ring->arm_wb = false;
 
        netdev_tx_completed_queue(netdev_get_tx_queue(tx_ring->netdev,
                                                      tx_ring->queue_index),
@@ -1290,6 +1288,7 @@ int i40evf_napi_poll(struct napi_struct *napi, int budget)
        i40e_for_each_ring(ring, q_vector->tx) {
                clean_complete &= i40e_clean_tx_irq(ring, vsi->work_limit);
                arm_wb |= ring->arm_wb;
+               ring->arm_wb = false;
        }
 
        /* We attempt to distribute budget to each Rx queue fairly, but don't