diff options
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 |
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 | ||
| 238 | cont_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 | } |
