Index: if_loop.c =================================================================== RCS file: /home/ncvs/src/sys/net/if_loop.c,v retrieving revision 1.93 diff -u -r1.93 if_loop.c --- if_loop.c 28 Dec 2003 03:55:59 -0000 1.93 +++ if_loop.c 9 Mar 2004 17:07:14 -0000 @@ -113,6 +113,7 @@ static MALLOC_DEFINE(M_LO, LONAME, "Loopback Interface"); +static struct mtx lo_mtx; static LIST_HEAD(lo_list, lo_softc) lo_list; struct if_clone lo_cloner = IF_CLONE_INITIALIZER(LONAME, @@ -129,9 +130,11 @@ /* XXX: destroying lo0 will lead to panics. */ KASSERT(loif != ifp, ("%s: destroying lo0", __func__)); + mtx_lock(&lo_mtx); + LIST_REMOVE(sc, sc_next); + mtx_unlock(&lo_mtx); bpfdetach(ifp); if_detach(ifp); - LIST_REMOVE(sc, sc_next); free(sc, M_LO); } @@ -154,7 +157,9 @@ sc->sc_if.if_softc = sc; if_attach(&sc->sc_if); bpfattach(&sc->sc_if, DLT_NULL, sizeof(u_int)); + mtx_lock(&lo_mtx); LIST_INSERT_HEAD(&lo_list, sc, sc_next); + mtx_unlock(&lo_mtx); if (loif == NULL) loif = &sc->sc_if; @@ -166,6 +171,7 @@ { switch (type) { case MOD_LOAD: + mtx_init(&lo_mtx, "lo_mtx", NULL, MTX_DEF); LIST_INIT(&lo_list); if_clone_attach(&lo_cloner); break;