From owner-svn-src-projects@freebsd.org Sat Apr 2 19:11:53 2016 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 30726AEC9E6 for ; Sat, 2 Apr 2016 19:11:53 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0BA911747; Sat, 2 Apr 2016 19:11:52 +0000 (UTC) (envelope-from bz@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u32JBqqi004210; Sat, 2 Apr 2016 19:11:52 GMT (envelope-from bz@FreeBSD.org) Received: (from bz@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u32JBqMl004207; Sat, 2 Apr 2016 19:11:52 GMT (envelope-from bz@FreeBSD.org) Message-Id: <201604021911.u32JBqMl004207@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: bz set sender to bz@FreeBSD.org using -f From: "Bjoern A. Zeeb" Date: Sat, 2 Apr 2016 19:11:52 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r297516 - projects/vnet/sys/net X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Apr 2016 19:11:53 -0000 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 \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; };