Hm, since attaches are not allowed, here is the patch as text.. And.. what is 
the correct way to submit a patch? because I suspect that just copy and paste 
will not work

Dmitry
________________________________________

if between "eop = tx_ring->buffer_info[i].next_to_watch" and check for DD-status
CPU is interrupted and another CPU queues send and hardware completes the send,
then we next_to_watch changes and we go inside cycle with invalid eop
with buffer_info->skb NULL. The solution is to reread eop at after DD-check.

Signed-off-by: Dmitry Skorodumov <sdmi...@parallels.com>

diff -r -p -u a/src/e1000_main.c b/src/e1000_main.c
--- a/src/e1000_main.c  2011-01-13 02:33:38.000000000 +0300
+++ b/src/e1000_main.c  2011-03-24 15:35:58.000000000 +0300
@@ -3557,6 +3557,11 @@ static bool e1000_clean_tx_irq(struct e1
        eop_desc = E1000_TX_DESC(*tx_ring, eop);
 
        while (eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) {
+               smp_rmb();
+               /* eop could change between read and DD-check */
+               if (eop != tx_ring->buffer_info[i].next_to_watch)
+                       goto cont_loop;
+
                for (cleaned = false; !cleaned; ) {
                        tx_desc = E1000_TX_DESC(*tx_ring, i);
                        buffer_info = &tx_ring->buffer_info[i];
@@ -3581,7 +3586,7 @@ static bool e1000_clean_tx_irq(struct e1
                        tx_desc->upper.data = 0;
                        E1000_TX_DESC_INC(tx_ring,i);
                }
-
+cont_loop:
                eop = tx_ring->buffer_info[i].next_to_watch;
                eop_desc = E1000_TX_DESC(*tx_ring, eop);
 #ifdef CONFIG_E1000_NAPI

------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel&#174; Ethernet, visit 
http://communities.intel.com/community/wired

Reply via email to