LOR + panic in scope6.c

Bjoern A. Zeeb bzeeb-lists at lists.zabbadoz.net
Tue Aug 9 21:25:10 GMT 2005


On Tue, 9 Aug 2005, John Baldwin wrote:

> > ...
> > skc0: no PHY found!
> > panic: ifp->if_afdata[AF_INET6] NULL
> > KDB: enter: panic
> > [thread pid 0 tid 0 ]
> > Stopped at      kdb_enter+0x2f: nop
> > db> where
> > Tracing pid 0 tid 0 td 0xffffffff8081e6c0
> > kdb_enter() at kdb_enter+0x2f
> > panic() at panic+0x1d2
> > in6_setscope() at in6_setscope+0x20f
> > in6_ifdetach() at in6_ifdetach+0x24a
> > if_detach() at if_detach+0x39
> > ether_ifdetach() at ether_ifdetach+0x35
> > sk_attach() at sk_attach+0x522
> > device_attach() at device_attach+0x292
> > bus_generic_attach() at bus_generic_attach+0x18
> > skc_attach() at skc_attach+0x6df
> > device_attach() at device_attach+0x292
> > ...
> >
> > bz at amd64:/local/building/freebsd/HEAD/sys> cvs -qR diff -up
> > netinet6/scope6.c Index: netinet6/scope6.c
> > ===================================================================
> > RCS file: /local/mirror/FreeBSD/r/ncvs/src/sys/netinet6/scope6.c,v
> > retrieving revision 1.15
> > diff -u -p -r1.15 scope6.c
> > --- netinet6/scope6.c   25 Jul 2005 17:28:39 -0000      1.15
> > +++ netinet6/scope6.c   9 Aug 2005 17:35:07 -0000
> > @@ -412,8 +412,13 @@ in6_setscope(in6, ifp, ret_id)
> >         u_int32_t zoneid = 0;
> >         struct scope6_id *sid;
> >
> > +       KASSERT(ifp != NULL, ("ifp NULL"));
> > +
> >         IF_AFDATA_LOCK(ifp);
> >
> > +       KASSERT(ifp->if_afdata[AF_INET6] != NULL,
> > +               ("ifp->if_afdata[AF_INET6] NULL"));
> > +
> >         sid = SID(ifp);
> >
> >  #ifdef DIAGNOSTIC
> >
> > Could it be a problem of ether_ifattach and ether_ifdetach being
> > run without the driver locks?  UP machine btw.
>
> I don't think it is a locking problem.  I think that the inet6 code is simply
> not taking into account some edge case.  In theory I don't think that
> if_afdata[AF_INET6] should be NULL since ether_ifattach() has called inet6's
> domain attach routine.  Are you sure that you have called ether_ifattach()
> btw?

so netinet6/ really is the place to check.

The code goes about like this:

...
        SK_UNLOCK(sc);
        ether_ifattach(ifp, eaddr);
        SK_LOCK(sc);
...
        SK_UNLOCK(sc);
        if (mii_phy_probe(dev, &sc_if->sk_miibus,
            sk_ifmedia_upd, sk_ifmedia_sts)) {
                printf("skc%d: no PHY found!\n", sc_if->sk_unit);
 boom ==>>      ether_ifdetach(ifp);
                if_free(ifp);
                error = ENXIO;
                goto fail;
        }


I guess I should check tomorrow that if_attachdomain1 really calls
the routines for AF_INET6 and what they do...

-- 
Bjoern A. Zeeb				bzeeb at Zabbadoz dot NeT


More information about the freebsd-current mailing list