Date: Mon, 15 Jul 2013 01:32:55 +0000 (UTC) From: Craig Rodrigues <rodrigc@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r253346 - in head/sys: kern net netgraph netgraph/bluetooth/socket Message-ID: <201307150132.r6F1WttU081255@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rodrigc Date: Mon Jul 15 01:32:55 2013 New Revision: 253346 URL: http://svnweb.freebsd.org/changeset/base/253346 Log: 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. Modified: head/sys/kern/subr_bus.c head/sys/net/if.c head/sys/netgraph/bluetooth/socket/ng_btsocket.c head/sys/netgraph/ng_base.c Modified: head/sys/kern/subr_bus.c ============================================================================== --- head/sys/kern/subr_bus.c Mon Jul 15 00:49:10 2013 (r253345) +++ head/sys/kern/subr_bus.c Mon Jul 15 01:32:55 2013 (r253346) @@ -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; } /** Modified: head/sys/net/if.c ============================================================================== --- head/sys/net/if.c Mon Jul 15 00:49:10 2013 (r253345) +++ head/sys/net/if.c Mon Jul 15 01:32:55 2013 (r253346) @@ -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 Modified: head/sys/netgraph/bluetooth/socket/ng_btsocket.c ============================================================================== --- head/sys/netgraph/bluetooth/socket/ng_btsocket.c Mon Jul 15 00:49:10 2013 (r253345) +++ head/sys/netgraph/bluetooth/socket/ng_btsocket.c Mon Jul 15 01:32:55 2013 (r253346) @@ -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 e return (error); } /* ng_btsocket_modevent */ -DOMAIN_SET(ng_btsocket_); +VNET_DOMAIN_SET(ng_btsocket_); Modified: head/sys/netgraph/ng_base.c ============================================================================== --- head/sys/netgraph/ng_base.c Mon Jul 15 00:49:10 2013 (r253345) +++ head/sys/netgraph/ng_base.c Mon Jul 15 01:32:55 2013 (r253346) @@ -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(); } /************************************************************************
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307150132.r6F1WttU081255>