On Mon, 30 Jan 2006, Jens Axboe wrote:
Running latest -git on my workstation, and I get so many TX timeouts
it's not even funny. I count 49 since I booted about 6 hours ago. All
net connections (naturally) stall every time this happens, and I'm going
crazy. I don't think this happened in 2.6.15, at least I don't remember
being so bothered by this before.

I'm attaching lspci and dmesg info from boot (including all the e1000 tx
timeouts). I've tried disabling TSO, however it doesn't make a
difference. Or perhaps it made it slightly worse, can't really say as I
don't know triggers this yet. Interestingly (?), e1000 seems to be the
only device in my system that only generates interrupts on CPU0:

           CPU0       CPU1
  0:   10707182   10691994    IO-APIC-edge  timer
  4:      11806       3421    IO-APIC-edge  serial
  8:          0          0    IO-APIC-edge  rtc
  9:          0          0   IO-APIC-level  acpi
 14:          2          0    IO-APIC-edge  ide0
169:     486260     486080   IO-APIC-level  uhci_hcd:usb5, nvidia
185:          2          0   IO-APIC-level  uhci_hcd:usb4
193:     192871     186449   IO-APIC-level  uhci_hcd:usb3
209:     106436     100338         PCI-MSI  libata
217:          3          0   IO-APIC-level  ehci_hcd:usb1, uhci_hcd:usb2
225:     245685     245033   IO-APIC-level  HDA Intel
233:     972220          0         PCI-MSI  eth0
NMI:       1943       1809
LOC:   21399067   21398990
ERR:          1
MIS:          0

This is a dual core pentium d. Let me knwo if you need more info and
I'll be happy to provide it.

Hi Jens, please be sure to disable TSO, also, is this pre-release hardware or production? The TDH (head) and TDT (tail) registers are 5 apart, which implies the hardware actually hung.

you may want to check your timers, and enable HPET or PM Timer. There were some issues with cpu clock throttling and the PIT timer that may be skewing your time, AFAIK.

and, if you want to, please try this patch:

e1000: add 82573 to TSO workaround code

After shipment, it was discovered that the 82571/2 workaround for TSO is
needed for the 82573 as well.  This code slightly rearchitects the
workaround code to a more clean implementation for multiple adapters.

Signed-off-by: Jesse Brandeburg <[EMAIL PROTECTED]>

---

 drivers/net/e1000/e1000_main.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -2902,21 +2902,29 @@ e1000_xmit_frame(struct sk_buff *skb, st
                max_per_txd = min(mss << 2, max_per_txd);
                max_txd_pwr = fls(max_per_txd) - 1;

-       /* TSO Workaround for 82571/2 Controllers -- if skb->data
+       /* TSO Workaround for 82571/2/3 Controllers -- if skb->data
         * points to just header, pull a few bytes of payload from
         * frags into skb->data */
                hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
-               if (skb->data_len && (hdr_len == (skb->len - skb->data_len)) &&
-                       (adapter->hw.mac_type == e1000_82571 ||
-                       adapter->hw.mac_type == e1000_82572)) {
-                       unsigned int pull_size;
-                       pull_size = min((unsigned int)4, skb->data_len);
-                       if (!__pskb_pull_tail(skb, pull_size)) {
-                               printk(KERN_ERR "__pskb_pull_tail failed.\n");
-                               dev_kfree_skb_any(skb);
-                               return -EFAULT;
+               if (skb->data_len && (hdr_len == (skb->len - skb->data_len))) {
+                       switch (adapter->hw.mac_type) {
+                               unsigned int pull_size;
+                       case e1000_82571:
+                       case e1000_82572:
+                       case e1000_82573:
+                               pull_size = min((unsigned int)4, skb->data_len);
+                               if (!__pskb_pull_tail(skb, pull_size)) {
+                                       DPRINTK(PROBE, ERR,
+                                               "__pskb_pull_tail failed.\n");
+                                       dev_kfree_skb_any(skb);
+                                       return -EFAULT;
+                               }
+                               len = skb->len - skb->data_len;
+                               break;
+                       default:
+                               /* do nothing */
+                               break;
                        }
-                       len = skb->len - skb->data_len;
                }
        }

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to