Skip site navigation (1)Skip section navigation (2)
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>