In if_detach_internal() we cannot hold the af_data lock over the

dom_ifdetach() calls as they might sleep for callout_drain().
Do as we do in if_attachdomain1() [r121470] and handle
if_afdata_initialized earlier and call dom_ifdetach() unlocked.

Discussed with:	rwatson
MFC after:	10 days
This commit is contained in:
Bjoern A. Zeeb 2010-04-11 11:51:44 +00:00
parent 318c3213e5
commit d8c136591a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=206470

View File

@ -897,14 +897,20 @@ if_detach_internal(struct ifnet *ifp, int vmove)
devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL);
if_delgroups(ifp);
/*
* We cannot hold the lock over dom_ifdetach calls as they might
* sleep, for example trying to drain a callout, thus open up the
* theoretical race with re-attaching.
*/
IF_AFDATA_LOCK(ifp);
for (dp = domains; ifp->if_afdata_initialized > 0 && dp; dp = dp->dom_next) {
i = ifp->if_afdata_initialized;
ifp->if_afdata_initialized = 0;
IF_AFDATA_UNLOCK(ifp);
for (dp = domains; i > 0 && dp; dp = dp->dom_next) {
if (dp->dom_ifdetach && ifp->if_afdata[dp->dom_family])
(*dp->dom_ifdetach)(ifp,
ifp->if_afdata[dp->dom_family]);
}
ifp->if_afdata_initialized = 0;
IF_AFDATA_UNLOCK(ifp);
}
#ifdef VIMAGE