Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Apr 2007 21:40:14 GMT
From:      Marko Zec <zec@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 118611 for review
Message-ID:  <200704222140.l3MLeE6b035304@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118611

Change 118611 by zec@zec_tca51 on 2007/04/22 21:39:58

	Introduce the notion of home_vnet for an ifnet, indicating
	the vnet instance where the ifnet was attached for the
	first time.
	
	Implement an idetach() routine for cleaning up the container
	holding virtualized state from sys/net stuff.

Affected files ...

.. //depot/projects/vimage/src/sys/net/if.c#11 edit
.. //depot/projects/vimage/src/sys/net/if_var.h#8 edit

Differences ...

==== //depot/projects/vimage/src/sys/net/if.c#11 (text+ko) ====

@@ -138,6 +138,9 @@
 #endif
 
 static int	vnet_net_iattach(void);
+#ifdef VIMAGE
+static int	vnet_net_idetach(void);
+#endif
 
 int	ifqmaxlen = IFQ_MAXLEN;
 struct	mtx ifnet_lock;
@@ -176,7 +179,7 @@
 	.name		= "net",
 	.symmap		= vnet_net_symmap,
 	.i_attach	= vnet_net_iattach,
-	.i_detach	= NULL,
+	.i_detach	= vnet_net_idetach
 };
 
 MALLOC_DEFINE(M_NET, "net", "NET instance");
@@ -370,6 +373,27 @@
 	return 0;
 }
 
+#ifdef VIMAGE
+static int
+vnet_net_idetach()
+{
+	INIT_VNET_NET(curvnet);
+
+	VNET_ASSERT(TAILQ_EMPTY(&V_ifnet));
+#ifdef NOTYET
+	VNET_ASSERT(TAILQ_EMPTY(&V_ifg_head));
+#endif
+	VNET_ASSERT(SLIST_EMPTY(&V_ifklist.kl_list));
+
+	free((caddr_t)V_ifindex_table, M_IFNET);
+
+	curvnet->mod_data[vnet_net_modinfo.id] = NULL;
+	free((caddr_t)vnet_net, M_NET);
+
+	return 0;
+}
+#endif
+
 void
 if_grow(void)
 {
@@ -517,8 +541,9 @@
 		    ifp->if_xname);
 
 #ifdef VIMAGE
-	ifp->if_vnet = vnet_net->parent_vnet;
-	ifp->if_vnet->ifccnt++;	/* XXX locking? */
+	ifp->if_vnet = curvnet;
+	if (ifp->if_home_vnet == NULL)
+		ifp->if_home_vnet = curvnet;
 #endif
 	TASK_INIT(&ifp->if_starttask, 0, if_start_deferred, ifp);
 	TASK_INIT(&ifp->if_linktask, 0, do_link_state_change, ifp);
@@ -606,6 +631,9 @@
 
 	IFNET_WLOCK();
 	TAILQ_INSERT_TAIL(&V_ifnet, ifp, if_link);
+#ifdef VIMAGE
+	curvnet->ifccnt++;
+#endif
 	IFNET_WUNLOCK();
 
 	if (domain_init_status >= 2)
@@ -752,16 +780,14 @@
 			found = 1;
 			break;
 		}
+#ifdef VIMAGE
+	if (found)
+		curvnet->ifccnt--;
+#endif
 	IFNET_WUNLOCK();
 	if (!found)
 		return;
 
-#ifdef VIMAGE
-	IFNET_WLOCK();
-	ifp->if_vnet->ifccnt--;
-	IFNET_WUNLOCK();
-#endif
-
 	/*
 	 * Remove/wait for pending events.
 	 */

==== //depot/projects/vimage/src/sys/net/if_var.h#8 (text+ko) ====

@@ -187,7 +187,9 @@
 					/* protected by if_addr_mtx */
 	void	*if_pf_kif;
 	void	*if_lagg;		/* lagg glue */
+
 	struct	vnet *if_vnet;		/* network stack instance */
+	struct	vnet *if_home_vnet;	/* where this ifnet originates from */
 };
 
 typedef void if_init_f_t(void *);



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