svn commit: r297516 - projects/vnet/sys/net
Bjoern A. Zeeb
bz at FreeBSD.org
Sat Apr 2 19:11:53 UTC 2016
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;
};
More information about the svn-src-projects
mailing list