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;