Index: sys/net/if.c =================================================================== --- sys/net/if.c +++ sys/net/if.c @@ -477,7 +477,11 @@ if_vmove(ifp, ifp->if_home_vnet); } } -VNET_SYSUNINIT(vnet_if_return, SI_SUB_VNET_DONE, SI_ORDER_ANY, +/* + * Dropped to just after SI_ORDER_ANY so that vnet_shutdown can be properly + * initiated in other SYSUNINITs before we proceed to tear down interfaces. + */ +VNET_SYSUNINIT(vnet_if_return, SI_SUB_VNET_DONE, SI_ORDER_MIDDLE, vnet_if_return, NULL); #endif @@ -1077,11 +1081,7 @@ struct domain *dp; struct ifnet *iter; int found = 0; -#ifdef VIMAGE - bool shutdown; - shutdown = ifp->if_vnet->vnet_shutdown; -#endif IFNET_WLOCK(); CK_STAILQ_FOREACH(iter, &V_ifnet, if_link) if (iter == ifp) { @@ -1151,7 +1151,7 @@ * On VNET shutdown abort here as the stack teardown will do all * the work top-down for us. */ - if (shutdown) { + if (ifp->if_vnet->vnet_shutdown) { /* Give interface users the chance to clean up. */ EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); Index: sys/net/vnet.c =================================================================== --- sys/net/vnet.c +++ sys/net/vnet.c @@ -357,7 +357,7 @@ /* Signal that VNET is being shutdown. */ curvnet->vnet_shutdown = 1; } -VNET_SYSUNINIT(vnet_sysuninit_shutdown, SI_SUB_VNET_DONE, SI_ORDER_FIRST, +VNET_SYSUNINIT(vnet_sysuninit_shutdown, SI_SUB_VNET_DONE, SI_ORDER_ANY, vnet_sysuninit_shutdown, NULL); /*