On Thursday 15 November 2012 07:18:31 Adrian Chadd wrote:
> Hi,
>
> Here's what I have thus far. Please ignore the device_printf() change.
>
> This works for me, both for hotplug cardbus wireless devices as well
> as (inadvertently!) a USB bluetooth device.
>
> What do you think?

It looks that you've hit the right spot to set curvnet context in 
device_probe_and_attach().

Could you try out a slightly revised verstion (attached) - this one also 
removes now redundant curvnet setting from linker routines (kldload / 
kldunload), and adds a few extra bits which might be necessary for a 
broader range of drivers to work.

Note that I haven't tested this myself as I don't have a -CURRENT machine 
ATM, but a similar patch for 8.3 apparently works fine, though I don't have 
hotplugabble network cards to play with (neither cardbus nor USB)...

Cheers,

Marko
Index: sys/kern/subr_bus.c
===================================================================
--- sys/kern/subr_bus.c	(revision 243091)
+++ sys/kern/subr_bus.c	(working copy)
@@ -53,6 +53,8 @@
 #include <sys/bus.h>
 #include <sys/interrupt.h>
 
+#include <net/vnet.h>
+
 #include <machine/stdarg.h>
 
 #include <vm/uma.h>
@@ -2735,7 +2737,11 @@
 		return (0);
 	else if (error != 0)
 		return (error);
-	return (device_attach(dev));
+
+	CURVNET_SET_QUIET(vnet0);
+	error = device_attach(dev);
+	CURVNET_RESTORE();
+	return (error);
 }
 
 /**
Index: sys/kern/kern_linker.c
===================================================================
--- sys/kern/kern_linker.c	(revision 243091)
+++ sys/kern/kern_linker.c	(working copy)
@@ -53,8 +53,6 @@
 #include <sys/syscallsubr.h>
 #include <sys/sysctl.h>
 
-#include <net/vnet.h>
-
 #include <security/mac/mac_framework.h>
 
 #include "linker_if.h"
@@ -1019,12 +1017,6 @@
 		return (error);
 
 	/*
-	 * It is possible that kldloaded module will attach a new ifnet,
-	 * so vnet context must be set when this ocurs.
-	 */
-	CURVNET_SET(TD_TO_VNET(td));
-
-	/*
 	 * If file does not contain a qualified name or any dot in it
 	 * (kldname.ko, or kldname.ver.ko) treat it as an interface
 	 * name.
@@ -1041,7 +1033,7 @@
 	error = linker_load_module(kldname, modname, NULL, NULL, &lf);
 	if (error) {
 		KLD_UNLOCK();
-		goto done;
+		return (error);
 	}
 	lf->userrefs++;
 	if (fileid != NULL)
@@ -1055,9 +1047,6 @@
 #else
 	KLD_UNLOCK();
 #endif
-
-done:
-	CURVNET_RESTORE();
 	return (error);
 }
 
@@ -1095,7 +1084,6 @@
 	if ((error = priv_check(td, PRIV_KLD_UNLOAD)) != 0)
 		return (error);
 
-	CURVNET_SET(TD_TO_VNET(td));
 	KLD_LOCK();
 	lf = linker_find_file_by_id(fileid);
 	if (lf) {
@@ -1137,7 +1125,6 @@
 #else
 	KLD_UNLOCK();
 #endif
-	CURVNET_RESTORE();
 	return (error);
 }
 
Index: sys/netgraph/bluetooth/socket/ng_btsocket.c
===================================================================
--- sys/netgraph/bluetooth/socket/ng_btsocket.c	(revision 243091)
+++ sys/netgraph/bluetooth/socket/ng_btsocket.c	(working copy)
@@ -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 @@
 	return (error);
 } /* ng_btsocket_modevent */
 
-DOMAIN_SET(ng_btsocket_);
+VNET_DOMAIN_SET(ng_btsocket_);
Index: sys/net/if.c
===================================================================
--- sys/net/if.c	(revision 243091)
+++ sys/net/if.c	(working copy)
@@ -504,6 +504,7 @@
 
 	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));
@@ -511,9 +512,9 @@
 	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();
 }
 
 /*
@@ -793,7 +794,9 @@
 if_detach(struct ifnet *ifp)
 {
 
+	CURVNET_SET_QUIET(ifp->if_vnet);
 	if_detach_internal(ifp, 0);
+	CURVNET_RESTORE();
 }
 
 static void
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to