diff --git a/sys/net/if.c b/sys/net/if.c index d1513d2a32d..08583a93885 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1088,10 +1088,9 @@ if_detach_internal(struct ifnet *ifp, int vmove, struct if_clone **ifcp) struct ifnet *iter; int found = 0; #ifdef VIMAGE - int shutdown; + bool shutdown; - shutdown = (ifp->if_vnet->vnet_state > SI_SUB_VNET && - ifp->if_vnet->vnet_state < SI_SUB_VNET_DONE) ? 1 : 0; + shutdown = ifp->if_vnet->vnet_shutdown; #endif IFNET_WLOCK(); CK_STAILQ_FOREACH(iter, &V_ifnet, if_link) @@ -1341,7 +1340,6 @@ if_vmove_loan(struct thread *td, struct ifnet *ifp, char *ifname, int jid) { struct prison *pr; struct ifnet *difp; - int shutdown; /* Try to find the prison within our visibility. */ sx_slock(&allprison_lock); @@ -1369,9 +1367,7 @@ if_vmove_loan(struct thread *td, struct ifnet *ifp, char *ifname, int jid) } /* Make sure the VNET is stable. */ - shutdown = (ifp->if_vnet->vnet_state > SI_SUB_VNET && - ifp->if_vnet->vnet_state < SI_SUB_VNET_DONE) ? 1 : 0; - if (shutdown) { + if (ifp->if_vnet->vnet_shutdown) { CURVNET_RESTORE(); prison_free(pr); return (EBUSY); @@ -1394,7 +1390,6 @@ if_vmove_reclaim(struct thread *td, char *ifname, int jid) struct prison *pr; struct vnet *vnet_dst; struct ifnet *ifp; - int shutdown; /* Try to find the prison within our visibility. */ sx_slock(&allprison_lock); @@ -1423,9 +1418,7 @@ if_vmove_reclaim(struct thread *td, char *ifname, int jid) } /* Make sure the VNET is stable. */ - shutdown = (ifp->if_vnet->vnet_state > SI_SUB_VNET && - ifp->if_vnet->vnet_state < SI_SUB_VNET_DONE) ? 1 : 0; - if (shutdown) { + if (ifp->if_vnet->vnet_shutdown) { CURVNET_RESTORE(); prison_free(pr); return (EBUSY); @@ -2993,16 +2986,11 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct thread *td) struct ifreq *ifr; int error; int oif_flags; -#ifdef VIMAGE - int shutdown; -#endif CURVNET_SET(so->so_vnet); #ifdef VIMAGE /* Make sure the VNET is stable. */ - shutdown = (so->so_vnet->vnet_state > SI_SUB_VNET && - so->so_vnet->vnet_state < SI_SUB_VNET_DONE) ? 1 : 0; - if (shutdown) { + if (so->so_vnet->vnet_shutdown) { CURVNET_RESTORE(); return (EBUSY); } diff --git a/sys/net/vnet.c b/sys/net/vnet.c index 9a4321a8409..e52989d5bb1 100644 --- a/sys/net/vnet.c +++ b/sys/net/vnet.c @@ -280,6 +280,9 @@ vnet_destroy(struct vnet *vnet) LIST_REMOVE(vnet, vnet_le); VNET_LIST_WUNLOCK(); + /* Signal that VNET is being shutdown. */ + vnet->vnet_shutdown = true; + CURVNET_SET_QUIET(vnet); vnet_sysuninit(); CURVNET_RESTORE(); diff --git a/sys/net/vnet.h b/sys/net/vnet.h index a8c9887ed50..6a5b4ae79ab 100644 --- a/sys/net/vnet.h +++ b/sys/net/vnet.h @@ -75,6 +75,7 @@ struct vnet { u_int vnet_state; /* SI_SUB_* */ void *vnet_data_mem; uintptr_t vnet_data_base; + bool vnet_shutdown; /* Shutdown in progress. */ }; #define VNET_MAGIC_N 0x3e0d8f29