aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mxge
diff options
context:
space:
mode:
authorAndrew Gallatin <gallatin@FreeBSD.org>2018-07-04 14:25:38 +0000
committerAndrew Gallatin <gallatin@FreeBSD.org>2018-07-04 14:25:38 +0000
commitc0a1f0af0c90d7c55390c1f3e27b751ae8e19c99 (patch)
treeca137a0e5325786a92f4469b45b6979878c7c56d /sys/dev/mxge
parent630ea924cfc9ff6846d98ee1267631056f939ffb (diff)
downloadsrc-c0a1f0af0c90d7c55390c1f3e27b751ae8e19c99.tar.gz
src-c0a1f0af0c90d7c55390c1f3e27b751ae8e19c99.zip
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.
Notes
Notes: svn path=/head/; revision=335957
Diffstat (limited to 'sys/dev/mxge')
-rw-r--r--sys/dev/mxge/if_mxge.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c
index 99b545e424c0..7ae603bc6744 100644
--- a/sys/dev/mxge/if_mxge.c
+++ b/sys/dev/mxge/if_mxge.c
@@ -4193,6 +4193,10 @@ mxge_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
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 data)
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,