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_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to