aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index b1e1c2daf5f9..936532fa42ad 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -203,6 +203,9 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter,
203 (count < tx_ring->work_limit)) { 203 (count < tx_ring->work_limit)) {
204 bool cleaned = false; 204 bool cleaned = false;
205 rmb(); /* read buffer_info after eop_desc */ 205 rmb(); /* read buffer_info after eop_desc */
206 /* eop could change between read and DD-check */
207 if (unlikely(eop != tx_ring->tx_buffer_info[i].next_to_watch))
208 goto cont_loop;
206 for ( ; !cleaned; count++) { 209 for ( ; !cleaned; count++) {
207 struct sk_buff *skb; 210 struct sk_buff *skb;
208 tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); 211 tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i);
@@ -232,6 +235,7 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter,
232 i = 0; 235 i = 0;
233 } 236 }
234 237
238cont_loop:
235 eop = tx_ring->tx_buffer_info[i].next_to_watch; 239 eop = tx_ring->tx_buffer_info[i].next_to_watch;
236 eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); 240 eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop);
237 } 241 }