mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 21:05:08 +00:00
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:
parent
c230e70881
commit
719fb72517
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253346
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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_);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
|
|
Loading…
Reference in a new issue