On Fri, Mar 31, 2006 at 02:16:38PM +0400, Boris B. Zhmurov wrote:
> 
> And xdelta tells, that e1000.ko was modified :)

Thanks for checking again.

Anyway, it didn't take long to find another bug in the same area.
I'm afraid this driver does seem to be full of them :)

It sets last_tx_tso in between computing the number of descriptors and
calling e1000_tx_map.  This is bad because e1000_tx_map gets the wrong
value for last_tx_tso and therefore may corrupt memory for every TSO
packet when the ring is almost full.

This bug exists on UP as well as SMP.

Signed-off-by: Herbert Xu <[EMAIL PROTECTED]>

Please try this in conjunction with the previous patch.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index 49cd096..38aeff9 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -2891,7 +2891,6 @@
        }
 
        if (likely(tso)) {
-               tx_ring->last_tx_tso = 1;
                tx_flags |= E1000_TX_FLAGS_TSO;
        } else if (likely(e1000_tx_csum(adapter, tx_ring, skb)))
                tx_flags |= E1000_TX_FLAGS_CSUM;
@@ -2905,6 +2904,8 @@
        e1000_tx_queue(adapter, tx_ring, tx_flags,
                       e1000_tx_map(adapter, tx_ring, skb, first,
                                    max_per_txd, nr_frags, mss));
+
+       tx_ring->last_tx_tso = tso;
 
        netdev->trans_start = jiffies;
 

Reply via email to