Author: gallatin
Date: Wed Jul  4 14:25:38 2018
New Revision: 335957
URL: https://svnweb.freebsd.org/changeset/base/335957

Log:
  mxge: fix panic at module unload
  
  r333175 (multicast changes) exposed a bug where
  mxge was not checking to see if the driver was being
  unloaded while handing ioctls that touch hardware.
  As a result, now that in6m_disconnect() is run from
  an async gtaskq, it was busy-waiting in mxge_send_cmd()
  while the mcast list was destroyed.

Modified:
  head/sys/dev/mxge/if_mxge.c

Modified: head/sys/dev/mxge/if_mxge.c
==============================================================================
--- head/sys/dev/mxge/if_mxge.c Wed Jul  4 14:20:19 2018        (r335956)
+++ head/sys/dev/mxge/if_mxge.c Wed Jul  4 14:25:38 2018        (r335957)
@@ -4193,6 +4193,10 @@ mxge_ioctl(struct ifnet *ifp, u_long command, caddr_t 
        case SIOCADDMULTI:
        case SIOCDELMULTI:
                mtx_lock(&sc->driver_mtx);
+               if (sc->dying) {
+                       mtx_unlock(&sc->driver_mtx);
+                       return (EINVAL);
+               }
                mxge_set_multicast_list(sc);
                mtx_unlock(&sc->driver_mtx);
                break;
@@ -4278,6 +4282,10 @@ mxge_ioctl(struct ifnet *ifp, u_long command, caddr_t 
 
        case SIOCGIFMEDIA:
                mtx_lock(&sc->driver_mtx);
+               if (sc->dying) {
+                       mtx_unlock(&sc->driver_mtx);
+                       return (EINVAL);
+               }
                mxge_media_probe(sc);
                mtx_unlock(&sc->driver_mtx);
                err = ifmedia_ioctl(ifp, (struct ifreq *)data,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to