Date: Fri, 4 Nov 2005 07:52:29 -0500 From: John Baldwin <jhb@FreeBSD.org> To: arch@FreeBSD.org Subject: ether_ifdetach() races round 3(?) Message-ID: <200511040752.29724.jhb@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
I had another moment of inspiration regarding the ether_ifdetach() races=20 during my shower this morning. Maybe this will gives us a viable solution= =20 this time. The reason we are having races is that once we call foo_stop(), the driver= =20 state is out of sync with the ifnet state because IFF_UP is still set even= =20 though the driver effectively has marked the interface down. The obvious=20 solution to that is to have the ifnet code "officially" mark the driver dow= n=20 by clearing IFF_UP. This would result in foo_ioctl() calling foo_stop()=20 rather than foo_detach() calling it explicitly. I think this is actually=20 cleaner in that drivers already rely on the ifnet layer calling foo_init()= =20 and don't call foo_init() in foo_attach(). Moving foo_stop() out of=20 foo_detach() and into the ifnet layer would thus be more consistent. =20 foo_detach() would go from: if (device_is_attached(sc)) { FOO_LOCK(sc); foo_stop(sc); FOO_UNLOCK(sc); callout_drain(&sc->sc_stat_callout); ether_ifdetach(sc->sc_ifp); } to just: if (device_is_attached(sc)) { ether_ifdetach(sc->sc_ifp); callout_drain(&sc->sc_stat_callout); } The only question then is when should ether_ifdetach() mark the interface a= s=20 down, and this actually ends up nice as it lets us fix all the other races= =20 with BPF and userland ioctls. Basically, we should detach the ifnet from=20 userland so no more userland requests can come in, then tear down kernel=20 consumers such as BPF, and mark the interface down resulting in an ioctl()= =20 that clears IFF_UP and calls foo_stop(). =2D-=20 John Baldwin <jhb@FreeBSD.org> =A0<>< =A0http://www.FreeBSD.org/~jhb/ "Power Users Use the Power to Serve" =A0=3D =A0http://www.FreeBSD.org
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200511040752.29724.jhb>