Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Aug 2009 22:55:46 +0100 (BST)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Sam Leffler <sam@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r196159 - head/sys/net80211
Message-ID:  <alpine.BSF.2.00.0908122255020.62111@fledge.watson.org>
In-Reply-To: <200908122119.n7CLJJlk077111@svn.freebsd.org>
References:  <200908122119.n7CLJJlk077111@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 12 Aug 2009, Sam Leffler wrote:

>  Drain link state event changes posted during vap destroy.  This is a
>  band-aid for the general problem that if_link_state_change can be
>  called between if_detach and if_free leaving a task queued that has
>  been free'd.

FYI to others -- we believe the proper fix should be in the ifnet framework, 
but this change was the lowest-risk way to resolve the problem for 8.0. 
Following the release we'll investigate having the ifnet framework provide 
this protection automatically for drivers.

Robert N M Watson
Computer Laboratory
University of Cambridge


>  Spotted by:	thompsa
>  Reviewed by:	rwatson
>  Approved by:	re (rwatson)
>
> Modified:
>  head/sys/net80211/ieee80211.c
>
> Modified: head/sys/net80211/ieee80211.c
> ==============================================================================
> --- head/sys/net80211/ieee80211.c	Wed Aug 12 21:06:43 2009	(r196158)
> +++ head/sys/net80211/ieee80211.c	Wed Aug 12 21:19:19 2009	(r196159)
> @@ -573,11 +573,13 @@ ieee80211_vap_detach(struct ieee80211vap
>
> 	/*
> 	 * Flush any deferred vap tasks.
> -	 * NB: must be before ether_ifdetach() and removal from ic_vaps list
> 	 */
> 	ieee80211_draintask(ic, &vap->iv_nstate_task);
> 	ieee80211_draintask(ic, &vap->iv_swbmiss_task);
>
> +	/* XXX band-aid until ifnet handles this for us */
> +	taskqueue_drain(taskqueue_swi, &ifp->if_linktask);
> +
> 	IEEE80211_LOCK(ic);
> 	KASSERT(vap->iv_state == IEEE80211_S_INIT , ("vap still running"));
> 	TAILQ_REMOVE(&ic->ic_vaps, vap, iv_next);
>



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