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