diff options
author | Andrew Gallatin <gallatin@FreeBSD.org> | 2018-07-04 14:25:38 +0000 |
---|---|---|
committer | Andrew Gallatin <gallatin@FreeBSD.org> | 2018-07-04 14:25:38 +0000 |
commit | c0a1f0af0c90d7c55390c1f3e27b751ae8e19c99 (patch) | |
tree | ca137a0e5325786a92f4469b45b6979878c7c56d /sys/dev/mxge | |
parent | 630ea924cfc9ff6846d98ee1267631056f939ffb (diff) | |
download | src-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.c | 8 |
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, |