diff options
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 060964378e58..a2c14bfd4b3f 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -763,6 +763,9 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, | |||
763 | if (!eop_desc) | 763 | if (!eop_desc) |
764 | break; | 764 | break; |
765 | 765 | ||
766 | /* prevent any other reads prior to eop_desc */ | ||
767 | rmb(); | ||
768 | |||
766 | /* if DD is not set pending work has not been completed */ | 769 | /* if DD is not set pending work has not been completed */ |
767 | if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) | 770 | if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) |
768 | break; | 771 | break; |
@@ -773,12 +776,8 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, | |||
773 | /* clear next_to_watch to prevent false hangs */ | 776 | /* clear next_to_watch to prevent false hangs */ |
774 | tx_buffer->next_to_watch = NULL; | 777 | tx_buffer->next_to_watch = NULL; |
775 | 778 | ||
776 | /* prevent any other reads prior to eop_desc being verified */ | ||
777 | rmb(); | ||
778 | |||
779 | do { | 779 | do { |
780 | ixgbe_unmap_tx_resource(tx_ring, tx_buffer); | 780 | ixgbe_unmap_tx_resource(tx_ring, tx_buffer); |
781 | tx_desc->wb.status = 0; | ||
782 | if (likely(tx_desc == eop_desc)) { | 781 | if (likely(tx_desc == eop_desc)) { |
783 | eop_desc = NULL; | 782 | eop_desc = NULL; |
784 | dev_kfree_skb_any(tx_buffer->skb); | 783 | dev_kfree_skb_any(tx_buffer->skb); |