From 44e6935441b272a48ab3b8d79168f128bd6b0413 Mon Sep 17 00:00:00 2001 From: Greg Rose Date: Fri, 3 Jun 2011 03:53:24 +0000 Subject: [PATCH] --- yaml --- r: 265568 b: refs/heads/master c: 98b9e48fca11c8aa54b25c02d3329392b52db8ab h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 5250aea8be57..3bfa2fc7d5ab 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dc221294719ae0f28cc260cc37edd439161088a9 +refs/heads/master: 98b9e48fca11c8aa54b25c02d3329392b52db8ab diff --git a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index b1e1c2daf5f9..936532fa42ad 100644 --- a/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/trunk/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -203,6 +203,9 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter, (count < tx_ring->work_limit)) { bool cleaned = false; rmb(); /* read buffer_info after eop_desc */ + /* eop could change between read and DD-check */ + if (unlikely(eop != tx_ring->tx_buffer_info[i].next_to_watch)) + goto cont_loop; for ( ; !cleaned; count++) { struct sk_buff *skb; tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); @@ -232,6 +235,7 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_adapter *adapter, i = 0; } +cont_loop: eop = tx_ring->tx_buffer_info[i].next_to_watch; eop_desc = IXGBE_TX_DESC_ADV(*tx_ring, eop); }