Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Sep 2004 17:52:50 +0200
From:      Jan Srzednicki <w@expro.pl>
To:        Robert Watson <rwatson@freebsd.org>
Cc:        current@freebsd.org
Subject:   Re: syscons problem in ddb, if_afdata initialization (was: Re: 5.3-BETA3 , panic, probably IPv6+SMP+mpsafenet related)
Message-ID:  <20040906155250.GH5879@miranda.expro.pl>
In-Reply-To: <Pine.NEB.3.96L.1040905015131.417B-100000@fledge.watson.org>
References:  <20040905053005.GA80420@neo.redjade.org> <Pine.NEB.3.96L.1040905015131.417B-100000@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Sep 05, 2004 at 01:52:32AM -0400, Robert Watson wrote:
> On Sun, 5 Sep 2004, Sangwoo Shim wrote:
> 
> > I've reported nd6_slowtimo related panic some while ago.  Please check
> > kern/70393.  mlaier@ suggested a patch to address this, but that wasn't
> > work for me.  I'll try your patch and report. Thanks. 
> 
> This patch may only fix the problem if running with debug.mpsafenet=0; I'm
> currently exploring the more general if_afdata issues, and will look at
> Max's patch (etc) in the report.  I hope to have a patch that solves it in
> the non-mpsafenet case in a day or two.

Hello,

It appears that a very similar panic (as Robert has figured out, related
to if_afdata not being properly initialized) happens in in6_tmpaddrtimer
function. The important part of the backtrace leading to this is:

#22 0xc065759b in in6_tmpaddrtimer (ignored_arg=0x0)
    at /usr/src/sys/netinet6/in6_ifattach.c:899
        ndi = (struct nd_ifinfo *) 0xc1406280
        nullbuf = "\000\000\000\000\000\000\000"
        ifp = (struct ifnet *) 0xc1405c00
#23 0xc05a364f in softclock (dummy=0x0) at /usr/src/sys/kern/kern_timeout.c:259
        c_func = (void (*)(void *)) 0xc0657520 <in6_tmpaddrtimer>
        c_arg = (void *) 0x0
        c_flags = 6
        c = (struct callout *) 0x0
        bucket = (struct callout_tailq *) 0xcfd00490
        steps = 6
        depth = 1
        mpcalls = 0
        gcalls = 1
        wakeup_cookie = 6
#24 0xc057dcad in ithread_loop (arg=0xc12b9c80)
    at /usr/src/sys/kern/kern_intr.c:546
        ih = (struct intrhand *) 0xc12e0780
        p = (struct proc *) 0xc12e7e00
        count = 0
        warming = 5000
        warned = 0
        __func__ = "ithread_loop"
#25 0xc057cc09 in fork_exit (callout=0xc057dab0 <ithread_loop>, arg=0x0, 
    frame=0x0) at /usr/src/sys/kern/kern_fork.c:820
        p = (struct proc *) 0xc12e7e00
#26 0xc0720dac in fork_trampoline () at /usr/src/sys/i386/i386/exception.s:209
No locals.
(kgdb) select-frame 22
(kgdb) print ifp
$1 = (struct ifnet *) 0xc1405c00
(kgdb) print *ifp
<snip here>
  if_prefixhead = {tqh_first = 0x0, tqh_last = 0xc1405d54}, if_afdata = {
    0x0 <repeats 37 times>}, if_afdata_initialized = 1, if_afdata_mtx = {
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This thing still happens to be not initialized properly, which comes up
again in a different function. So, I guess a similar workaround is
needed here too, until the problem is solved.

That's the workaround for the same (I think) problem that came up in the
nd6_slowtimo() function (by Robert, of course), as it hasn't been posted
on the list yet:

==== //depot/user/rwatson/netperf/sys/netinet6/nd6.c#9 - /home/rwatson/p4/rwatson_netperf/sys/netinet6/nd6.c ====
@@ -1779,6 +1779,8 @@                          
            nd6_slowtimo, NULL);
        IFNET_RLOCK();         
        for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
+               if (ifp->if_afdata[AF_INET6] == NULL)
+                       continue;
                nd6if = ND_IFINFO(ifp);
                if (nd6if->basereachable && /* already initialized */ 
                    (nd6if->recalctm -= ND6_SLOWTIMER_INTERVAL) <= 0) {

greetings,
-- 
Jan 'Winfried' Srzednicki
w@expro.pl



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040906155250.GH5879>