svn commit: r240938 - head/sys/net
Ed Maste
emaste at FreeBSD.org
Tue Sep 25 22:10:15 UTC 2012
Author: emaste
Date: Tue Sep 25 22:10:14 2012
New Revision: 240938
URL: http://svn.freebsd.org/changeset/base/240938
Log:
Avoid INVARIANTS panic destroying an in-use tap(4)
The requirement (implied by the KASSERT in tap_destroy) that the tap is
closed isn't valid; destroy_dev will block in devdrn while other threads
are in d_* functions.
Note: if_tun had the same issue, addressed in SVN revisions r186391,
r186483 and r186497. The use of the condvar there appears to be
redundant with the functionality provided by destroy_dev.
Sponsored by: ADARA Networks
Reviewed by: dwhite
MFC after: 2 weeks
Modified:
head/sys/net/if_tap.c
head/sys/net/if_tapvar.h
Modified: head/sys/net/if_tap.c
==============================================================================
--- head/sys/net/if_tap.c Tue Sep 25 21:33:36 2012 (r240937)
+++ head/sys/net/if_tap.c Tue Sep 25 22:10:14 2012 (r240938)
@@ -213,14 +213,10 @@ tap_destroy(struct tap_softc *tp)
{
struct ifnet *ifp = tp->tap_ifp;
- /* Unlocked read. */
- KASSERT(!(tp->tap_flags & TAP_OPEN),
- ("%s flags is out of sync", ifp->if_xname));
-
CURVNET_SET(ifp->if_vnet);
+ destroy_dev(tp->tap_dev);
seldrain(&tp->tap_rsel);
knlist_destroy(&tp->tap_rsel.si_note);
- destroy_dev(tp->tap_dev);
ether_ifdetach(ifp);
if_free(ifp);
Modified: head/sys/net/if_tapvar.h
==============================================================================
--- head/sys/net/if_tapvar.h Tue Sep 25 21:33:36 2012 (r240937)
+++ head/sys/net/if_tapvar.h Tue Sep 25 22:10:14 2012 (r240938)
@@ -64,6 +64,7 @@ struct tap_softc {
SLIST_ENTRY(tap_softc) tap_next; /* next device in chain */
struct cdev *tap_dev;
struct mtx tap_mtx; /* per-softc mutex */
+ struct cv tap_cv; /* protect ref'd dev destroy */
};
#endif /* !_NET_IF_TAPVAR_H_ */
More information about the svn-src-all
mailing list