Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Apr 2016 19:11:52 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r297516 - projects/vnet/sys/net
Message-ID:  <201604021911.u32JBqMl004207@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Sat Apr  2 19:11:51 2016
New Revision: 297516
URL: https://svnweb.freebsd.org/changeset/base/297516

Log:
  Switch vnet_state to directly use SI_SUB_* values.   That way we
  also have possible rugh guess where in the bringup or teardown
  we are.
  
  Add a show vnet command to ddb which allows us to inspect a vnet which
  is no longer on the all-vnet-list.
  Rename show vnets to show all vnets as it slways should have been.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/vnet/sys/net/if.c
  projects/vnet/sys/net/vnet.c
  projects/vnet/sys/net/vnet.h

Modified: projects/vnet/sys/net/if.c
==============================================================================
--- projects/vnet/sys/net/if.c	Sat Apr  2 19:06:33 2016	(r297515)
+++ projects/vnet/sys/net/if.c	Sat Apr  2 19:11:51 2016	(r297516)
@@ -959,7 +959,8 @@ if_detach_internal(struct ifnet *ifp, in
 	/* The one thing we have to do. */
 	if_delgroups(ifp);
 
-	if (!vmove && !shutdown && ifp->if_vnet->vnet_state == VNET_STATE_DYING_AFTER_PSEUDO)
+	if (!vmove && !shutdown &&
+	    ifp->if_vnet->vnet_state <= SI_SUB_PSEUDO_DONE)
 		return (ENOENT);
 
 	/* Check if this is a cloned interface or not. */

Modified: projects/vnet/sys/net/vnet.c
==============================================================================
--- projects/vnet/sys/net/vnet.c	Sat Apr  2 19:06:33 2016	(r297515)
+++ projects/vnet/sys/net/vnet.c	Sat Apr  2 19:11:51 2016	(r297516)
@@ -233,7 +233,7 @@ vnet_alloc(void)
 	SDT_PROBE1(vnet, functions, vnet_alloc, entry, __LINE__);
 	vnet = malloc(sizeof(struct vnet), M_VNET, M_WAITOK | M_ZERO);
 	vnet->vnet_magic_n = VNET_MAGIC_N;
-	vnet->vnet_state = VNET_STATE_STARTING;
+	vnet->vnet_state = 0;
 	SDT_PROBE2(vnet, functions, vnet_alloc, alloc, __LINE__, vnet);
 
 	/*
@@ -256,7 +256,6 @@ vnet_alloc(void)
 	CURVNET_RESTORE();
 
 	VNET_LIST_WLOCK();
-	vnet->vnet_state = VNET_STATE_ACTIVE;
 	LIST_INSERT_HEAD(&vnet_head, vnet, vnet_le);
 	VNET_LIST_WUNLOCK();
 
@@ -276,7 +275,6 @@ vnet_destroy(struct vnet *vnet)
 	    ("%s: vnet still has sockets", __func__));
 
 	VNET_LIST_WLOCK();
-	vnet->vnet_state = VNET_STATE_DYING;
 	LIST_REMOVE(vnet, vnet_le);
 	VNET_LIST_WUNLOCK();
 
@@ -296,23 +294,6 @@ vnet_destroy(struct vnet *vnet)
 }
 
 /*
- * Cloned interfaces have become such a layer violation that they need
- * special treatmeant.   They need to go very first and they need to be able
- * to clean themselves up entirely and not wait for the stack to shutdown as
- * we if_free() them.  We would like to split the cleanup of them up as well
- * but in a non-VNET context a ifconfig foo0 destroy still has t work as well.
- * This MUST be the only SYSUNINIT on SI_SUB_PSEUDO_DONE/SI_ORDER_FIRST!
- */
-static void
-vnet_uninit_after_pseudo(const void *unused __unused)
-{
-
-	curvnet->vnet_state = VNET_STATE_DYING_AFTER_PSEUDO;
-}
-VNET_SYSUNINIT(vnet_if_uninit_after_pseudo, SI_SUB_PSEUDO_DONE, SI_ORDER_FIRST,
-    vnet_uninit_after_pseudo, NULL);
-
-/*
  * Boot time initialization and allocation of virtual network stacks.
  */
 static void
@@ -350,7 +331,6 @@ vnet_init_done(void *unused)
 
 	curvnet = NULL;
 }
-
 SYSINIT(vnet_init_done, SI_SUB_VNET_DONE, SI_ORDER_FIRST, vnet_init_done,
     NULL);
 
@@ -583,6 +563,7 @@ vnet_sysinit(void)
 
 	VNET_SYSINIT_RLOCK();
 	TAILQ_FOREACH(vs, &vnet_constructors, link) {
+		curvnet->vnet_state = vs->subsystem;
 		vs->func(vs->arg);
 	}
 	VNET_SYSINIT_RUNLOCK();
@@ -602,6 +583,7 @@ vnet_sysuninit(void)
 	TAILQ_FOREACH_REVERSE(vs, &vnet_destructors, vnet_sysuninit_head,
 	    link) {
 		vs->func(vs->arg);
+		curvnet->vnet_state = vs->subsystem;
 	}
 	VNET_SYSINIT_RUNLOCK();
 }
@@ -702,31 +684,46 @@ vnet_log_recursion(struct vnet *old_vnet
  * DDB(4).
  */
 #ifdef DDB
-DB_SHOW_COMMAND(vnets, db_show_vnets)
+static void
+db_vnet_print(struct vnet *vnet)
+{
+
+	db_printf("vnet            = %p\n", vnet);
+	db_printf(" vnet_magic_n   = 0x%x (%s, orig 0x%x)\n",
+	    vnet->vnet_magic_n,
+	    (vnet->vnet_magic_n == VNET_MAGIC_N) ?
+		"ok" : "mismatch", VNET_MAGIC_N);
+	db_printf(" vnet_ifcnt     = %u\n", vnet->vnet_ifcnt);
+	db_printf(" vnet_sockcnt   = %u\n", vnet->vnet_sockcnt);
+	db_printf(" vnet_data_mem  = %p\n", vnet->vnet_data_mem);
+	db_printf(" vnet_data_base = 0x%jx\n",
+	    (uintmax_t)vnet->vnet_data_base);
+	db_printf(" vnet_state     = %#x\n", vnet->vnet_state);
+	db_printf("\n");
+}
+
+DB_SHOW_ALL_COMMAND(vnets, db_show_all_vnets)
 {
 	VNET_ITERATOR_DECL(vnet_iter);
 
 	VNET_FOREACH(vnet_iter) {
-		if (have_addr && addr != 0 &&
-		    (struct vnet *)addr != vnet_iter)
-			continue;
-		db_printf("vnet            = %p\n", vnet_iter);
-		db_printf(" vnet_magic_n   = 0x%x (%s, orig 0x%x)\n",
-		    vnet_iter->vnet_magic_n,
-		    (vnet_iter->vnet_magic_n == VNET_MAGIC_N) ?
-			"ok" : "mismatch", VNET_MAGIC_N);
-		db_printf(" vnet_ifcnt     = %u\n", vnet_iter->vnet_ifcnt);
-		db_printf(" vnet_sockcnt   = %u\n", vnet_iter->vnet_sockcnt);
-		db_printf(" vnet_data_mem  = %p\n", vnet_iter->vnet_data_mem);
-		db_printf(" vnet_data_base = 0x%jx\n",
-		    (uintmax_t)vnet_iter->vnet_data_base);
-		db_printf(" vnet_state     = %#x\n", vnet_iter->vnet_state);
-		db_printf("\n");
+		db_vnet_print(vnet_iter);
 		if (db_pager_quit)
 			break;
 	}
 }
 
+DB_SHOW_COMMAND(vnet, db_show_vnet)
+{
+
+	if (!have_addr) {
+		db_printf("usage: show vnet <struct vnet *>\n");
+		return;
+	}
+
+	db_vnet_print((struct vnet *)addr);
+}
+
 static void
 db_show_vnet_print_vs(struct vnet_sysinit *vs, int ddb)
 {

Modified: projects/vnet/sys/net/vnet.h
==============================================================================
--- projects/vnet/sys/net/vnet.h	Sat Apr  2 19:06:33 2016	(r297515)
+++ projects/vnet/sys/net/vnet.h	Sat Apr  2 19:11:51 2016	(r297516)
@@ -70,11 +70,7 @@ struct vnet {
 	u_int			 vnet_magic_n;
 	u_int			 vnet_ifcnt;
 	u_int			 vnet_sockcnt;
-	u_int			 vnet_state;
-#define	VNET_STATE_STARTING		0x01
-#define	VNET_STATE_ACTIVE		0x02
-#define	VNET_STATE_DYING		0x04
-#define	VNET_STATE_DYING_AFTER_PSEUDO	0x08
+	u_int			 vnet_state;	/* SI_SUB_* */
 	void			*vnet_data_mem;
 	uintptr_t		 vnet_data_base;
 };



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