Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 03 Oct 2005 11:25:26 -0600 (MDT)
From:      "M. Warner Losh" <imp@bsdimp.com>
To:        jhb@FreeBSD.ORG
Cc:        arch@FreeBSD.ORG, ru@FreeBSD.ORG
Subject:   Re: Ethernet driver teardown
Message-ID:  <20051003.112526.102577313.imp@bsdimp.com>
In-Reply-To: <200510031246.14835.jhb@FreeBSD.org>
References:  <200510031246.14835.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
In message: <200510031246.14835.jhb@FreeBSD.org>
            John Baldwin <jhb@FreeBSD.org> writes:
: So, I was thinking about the problem with ethernet driver detach races this 
: morning and had an idea.  What if the sequence for detach() was altered such 
: that we called ether_ifdetach() before the driver's stop() routine?  Thus, 
: you would end up with something like this:
: 
: foo_detach()
: {
: 
: 	ether_ifdetach(sc->foo_ifp);
: 	FOO_LOCK(sc);
: 	foo_stop(sc);
	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;	/* or does foo_stop do this? */
: 	FOO_UNLOCK(sc);
: 	callout_drain(...);
: 	bus_teardown_intr(...);
: 	if_free(sc->foo_ifp);
: 	bus_release_resources(...);
: 	...
: }
: 
: Would that solve the various races including letting BPF turn off promiscuous 
: mode cleanly without requiring detaching flags in each driver to bail out of 
: foo_ioctl()?

I'm unusure.  I'm prettys sure that the promisc mode would be turned
off correctly, but see below.

This does represent an improvement over the current method.  I have a
couple of concerns.

(1) What happens to the packets received when the device is detached.
    We'll have to make sure that the ifp is in a state that can allow
    for the input routine to still be called w/o leaking memory.

(2) Does this solve the problems that I originally suggested a
    if_dead() routine for?

(3) How do we know that we're out of all the ifp callbacks when
    ether_ifdetach() returns?  If we forced a lock/unlock pair for all
    ioctl functions, then we could know for sure when we acquire the
    lock.  I'm unsure what to do about if_output, if_start and
    if_watchdog.

Warner



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