Fix witness panic in the ipoib_ioctl() function when unloading the
ipoib module. The bpfdetach() function is trying to turn off promiscious mode on the network interface it is attached to while holding a mutex. The fix consists of ignoring any further calls to the ipoib_ioctl() function when the network interface is going to be detached. The ipoib_ioctl() function might sleep. Sponsored by: Mellanox Technologies MFC after: 1 week
This commit is contained in:
parent
3ef966c4c0
commit
9319562b86
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=296909
@ -322,6 +322,8 @@ struct ipoib_dev_priv {
|
||||
|
||||
unsigned long flags;
|
||||
|
||||
int gone;
|
||||
|
||||
struct mutex vlan_mutex;
|
||||
|
||||
struct rb_root path_tree;
|
||||
|
@ -258,6 +258,10 @@ ipoib_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
|
||||
struct ifreq *ifr = (struct ifreq *) data;
|
||||
int error = 0;
|
||||
|
||||
/* check if detaching */
|
||||
if (priv == NULL || priv->gone != 0)
|
||||
return (ENXIO);
|
||||
|
||||
switch (command) {
|
||||
case SIOCSIFFLAGS:
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
@ -794,6 +798,7 @@ ipoib_detach(struct ipoib_dev_priv *priv)
|
||||
|
||||
dev = priv->dev;
|
||||
if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
|
||||
priv->gone = 1;
|
||||
bpfdetach(dev);
|
||||
if_detach(dev);
|
||||
if_free(dev);
|
||||
|
Loading…
Reference in New Issue
Block a user