svn commit: r191912 - in head/sys/dev: ipw iwi

John Baldwin jhb at FreeBSD.org
Fri May 8 18:50:08 UTC 2009


Andrew Thompson wrote:
> On Fri, May 08, 2009 at 01:41:04PM -0400, John Baldwin wrote:
>> Andrew Thompson wrote:
>>> Author: thompsa
>>> Date: Fri May  8 13:44:33 2009
>>> New Revision: 191912
>>> URL: http://svn.freebsd.org/changeset/base/191912
>>>
>>> Log:
>>>   Drain the tasks before the interface stop call in case a restart was queued.
>> Actually, you have to drain it after if_detach() so you can safely destroy 
>> the lock.  The proper order should be something like this:
>>
>> 	bpfdetach(ifp);
>> 	ieee80211_ifdetach(ic);
>>
>> 	ipw_stop(sc);
>>
>> 	callout_drain();
>> 	ieee80211_draintask();
>>
>> 	ipw_release(sc);
>>
>> This is the order other NIC drivers use where they do something like:
>>
>> 	ether_ifdetach(ifp);
>> 	FOO_LOCK(sc);
>> 	foo_stop(sc);		// calls callout_stop()
>> 	FOO_UNLOCK(sc);
>>
>> 	callout_drain();
>> 	taskqueue_drain();	// only if it uses tasks
>>
>> 	if_free();
>> 	mtx_destroy();
> 
> ieee80211_ifdetach() will actually free the taskqueue, it doesnt use one
> of the persistent system ones. It wasnt incorrect before as the
> interface would still be brought down before net80211 detached, it was
> just to reduce the flip flopping. With that noted does it still need
> reordering?

Assuming that free'ing a taskqueue drains any tasks, then you don't 
actually need to drain the task queue in that case.  However, you should 
still move the foo_stop() after if_detach() as userland ioctl requests 
are still able to call your driver's ioctl() routine until if_detach() 
returns.  So perhaps something like this:

	bpfdetach()
	ieee80211_ifdetach()

	ipw_stop();

	callout_drain();

	ipw_release();

In general, it isn't really safe to shutdown the hardware (foo_stop()) 
until you have detached the driver from external code paths (ifnet, bpf, 
etc.).

-- 
John Baldwin


More information about the svn-src-all mailing list