Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Jul 2008 16:52:46 -0600
From:      James Gritton <jamie@gritton.org>
To:        freebsd-virtualization@freebsd.org
Subject:   IFNET_WLOCK missing from if_reassign_common
Message-ID:  <487BD8BE.1040609@gritton.org>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
In testing jail_set_vimage, I found that moving a network interface 
cause a assertion failure in ifnet_setbyindex.  It turns out that 
if_reassign_common in kern_vimage.c should be locking IFNET_WLOCK.  I'm 
including a patch that locks it in the same way it's done in if_alloc 
(which seems to be the inspiration for much of this code).

- Jamie

[-- Attachment #2 --]
--- ov/src/sys/kern/kern_vimage.c	Wed Jul  9 14:14:03 2008
+++ src/sys/kern/kern_vimage.c	Mon Jul 14 16:44:18 2008
@@ -283,10 +283,12 @@
 	do {
 		INIT_VNET_NET(curvnet);
 
+		IFNET_WLOCK();
 		ifnet_setbyindex(ifp->if_index, NULL);
 		/* XXX: should be locked with if_findindex() */
 		while (V_if_index > 0 && ifnet_byindex(V_if_index) == NULL)
 			V_if_index--;
+		IFNET_WUNLOCK();
 	} while (0);
 
 	CURVNET_SET_QUIET(new_vnet);
@@ -309,7 +311,9 @@
 		V_if_index = ifp->if_index;
 	if (V_if_index >= V_if_indexlim)
 		if_grow();
+	IFNET_WLOCK();
 	ifnet_setbyindex(ifp->if_index, ifp);
+	IFNET_WUNLOCK();
 
 	/* Rename the ifnet */
 	if (new_vnet == ifp->if_home_vnet) {

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?487BD8BE.1040609>