Date: Tue, 23 Nov 2004 01:16:02 +0100 (CET) From: Sten Spans <sten@blinkenlights.nl> To: John Baldwin <jhb@FreeBSD.org> Cc: freebsd-alpha@FreeBSD.org Subject: Re: alpha and em mtu Message-ID: <Pine.SOC.4.61.0411230026430.10997@tea.blinkenlights.nl> In-Reply-To: <200411221711.54916.jhb@FreeBSD.org> References: <Pine.SOC.4.61.0411142153430.26307@tea.blinkenlights.nl> <Pine.SOC.4.61.0411222147180.10997@tea.blinkenlights.nl> <200411221711.54916.jhb@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, 22 Nov 2004, John Baldwin wrote: > On Monday 22 November 2004 04:15 pm, Sten Spans wrote: >> >> db> trace >> tcp_input() at tcp_input+0x3a4 >> ip_input() at ip_input+0x9fc >> netisr_processqueue() at netisr_processqueue+0xac >> swi_net() at swi_net+0xf0 >> ithread_loop() at ithread_loop+0x1d4 >> fork_exit() at fork_exit+0x100 >> exception_return() at exception_return >> --- root of call graph --- >> >> (gdb) l *tcp_input+0x3a4 >> 0xfffffc00004cd054 is in tcp_input (/usr/src/sys/netinet/tcp_input.c:554). >> 549 >> 550 /* >> 551 * Check that TCP offset makes sense, >> 552 * pull out TCP options and adjust length. >> XXX >> 553 */ >> 554 off = th->th_off << 2; >> 555 if (off < sizeof (struct tcphdr) || off > tlen) { >> 556 tcpstat.tcps_rcvbadoff++; >> 557 goto drop; >> 558 } >> (gdb) l *ip_input+0x9fc >> 0xfffffc00004c355c is in ip_input (/usr/src/sys/netinet/ip_input.c:739). >> 734 /* >> 735 * Switch out to protocol's input routine. >> 736 */ >> 737 ipstat.ips_delivered++; >> 738 >> 739 (*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen); >> 740 return; >> 741 bad: >> 742 m_freem(m); >> 743 } >> (gdb) l *netisr_processqueue+0xac >> 0xfffffc00004ad45c is in netisr_processqueue >> (/usr/src/sys/net/netisr.c:233). >> 228 >> 229 for (;;) { >> 230 IF_DEQUEUE(ni->ni_queue, m); >> 231 if (m == NULL) >> 232 break; >> 233 ni->ni_handler(m); >> 234 } >> 235 } > > Hmm, so can you check here to see if the 'm' pointer in this routine is > misaligned? If so, then this may be a driver bug. > --- netisr.c.orig Tue Nov 23 00:21:38 2004 +++ netisr.c Tue Nov 23 00:21:45 2004 @@ -230,6 +230,8 @@ IF_DEQUEUE(ni->ni_queue, m); if (m == NULL) break; + if (((uintptr_t)m & 0x3) != 0) + printf("%s: mbuf %p is misaligned\n", __func__, m); ni->ni_handler(m); } } doesn't seem to print anything, but ... if_em.c 2442 2443 /*if (ifp->if_mtu <= ETHERMTU) { */ 2444 m_adj(mp, ETHER_ALIGN); 2445 /*} */ 2446 does seem to fix the crash, also trashes the performance, but that's another matter. It looks like mbuf alignment is needed, if_bge seems to provide reasonable examples. -- Sten Spans "There is a crack in everything, that's how the light gets in." Leonard Cohen - Anthem
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SOC.4.61.0411230026430.10997>