Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 4 Jul 2018 14:25:38 +0000 (UTC)
From:      Andrew Gallatin <gallatin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335957 - head/sys/dev/mxge
Message-ID:  <201807041425.w64EPcRV034874@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help

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,



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