Skip site navigation (1)Skip section navigation (2)
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>