PR: 168520 170096

Submitted by: adrian, zec

Fix multiple kernel panics when VIMAGE is enabled in the kernel.
These fixes are based on patches submitted by Adrian Chadd and Marko Zec.

(1)  Set curthread->td_vnet to vnet0 in device_probe_and_attach() just before calling
     device_attach().  This fixes multiple VIMAGE related kernel panics
     when trying to attach Bluetooth or USB Ethernet devices because
     curthread->td_vnet is NULL.

(2)  Set curthread->td_vnet in if_detach().  This fixes kernel panics when detaching networking
     interfaces, especially USB Ethernet devices.

(3)  Use VNET_DOMAIN_SET() in ng_btsocket.c

(4)  In ng_unref_node() set curthread->td_vnet.  This fixes kernel panics
     when detaching Netgraph nodes.
This commit is contained in:
Craig Rodrigues 2013-07-15 01:32:55 +00:00
parent c230e70881
commit 719fb72517
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253346
4 changed files with 19 additions and 5 deletions

View File

@ -53,6 +53,8 @@ __FBSDID("$FreeBSD$");
#include <sys/bus.h>
#include <sys/interrupt.h>
#include <net/vnet.h>
#include <machine/stdarg.h>
#include <vm/uma.h>
@ -2735,7 +2737,11 @@ device_probe_and_attach(device_t dev)
return (0);
else if (error != 0)
return (error);
return (device_attach(dev));
CURVNET_SET_QUIET(vnet0);
error = device_attach(dev);
CURVNET_RESTORE();
return error;
}
/**

View File

@ -505,6 +505,7 @@ if_free(struct ifnet *ifp)
ifp->if_flags |= IFF_DYING; /* XXX: Locking */
CURVNET_SET_QUIET(ifp->if_vnet);
IFNET_WLOCK();
KASSERT(ifp == ifnet_byindex_locked(ifp->if_index),
("%s: freeing unallocated ifnet", ifp->if_xname));
@ -512,9 +513,9 @@ if_free(struct ifnet *ifp)
ifindex_free_locked(ifp->if_index);
IFNET_WUNLOCK();
if (!refcount_release(&ifp->if_refcount))
return;
if_free_internal(ifp);
if (refcount_release(&ifp->if_refcount))
if_free_internal(ifp);
CURVNET_RESTORE();
}
/*
@ -803,7 +804,9 @@ void
if_detach(struct ifnet *ifp)
{
CURVNET_SET_QUIET(ifp->if_vnet);
if_detach_internal(ifp, 0);
CURVNET_RESTORE();
}
static void

View File

@ -46,6 +46,8 @@
#include <sys/sysctl.h>
#include <sys/taskqueue.h>
#include <net/vnet.h>
#include <netgraph/ng_message.h>
#include <netgraph/netgraph.h>
#include <netgraph/bluetooth/include/ng_bluetooth.h>
@ -285,4 +287,4 @@ ng_btsocket_modevent(module_t mod, int event, void *data)
return (error);
} /* ng_btsocket_modevent */
DOMAIN_SET(ng_btsocket_);
VNET_DOMAIN_SET(ng_btsocket_);

View File

@ -789,6 +789,8 @@ ng_unref_node(node_p node)
if (node == &ng_deadnode)
return;
CURVNET_SET(node->nd_vnet);
if (refcount_release(&node->nd_refs)) { /* we were the last */
node->nd_type->refs--; /* XXX maybe should get types lock? */
@ -807,6 +809,7 @@ ng_unref_node(node_p node)
mtx_destroy(&node->nd_input_queue.q_mtx);
NG_FREE_NODE(node);
}
CURVNET_RESTORE();
}
/************************************************************************