Index: stable/12/sys/net/if_bridge.c =================================================================== --- stable/12/sys/net/if_bridge.c +++ stable/12/sys/net/if_bridge.c @@ -605,7 +605,7 @@ /* Before we can destroy the uma zone, because there are callbacks that * use it. */ - NET_EPOCH_WAIT(); + epoch_drain_callbacks(net_epoch_preempt); uma_zdestroy(V_bridge_rtnode_zone); } @@ -2114,17 +2114,20 @@ bridge_output(struct ifnet *ifp, struct mbuf *m, struct sockaddr *sa, struct rtentry *rt) { + struct epoch_tracker et; struct ether_header *eh; struct ifnet *dst_if; struct bridge_softc *sc; uint16_t vlan; - MPASS(in_epoch(net_epoch_preempt)); + NET_EPOCH_ENTER_ET(et); if (m->m_len < ETHER_HDR_LEN) { m = m_pullup(m, ETHER_HDR_LEN); - if (m == NULL) + if (m == NULL) { + NET_EPOCH_EXIT_ET(et); return (0); + } } eh = mtod(m, struct ether_header *); @@ -2189,6 +2192,7 @@ } if (used == 0) m_freem(m); + NET_EPOCH_EXIT_ET(et); return (0); } @@ -2200,10 +2204,12 @@ bridge_span(sc, m); if ((dst_if->if_drv_flags & IFF_DRV_RUNNING) == 0) { m_freem(m); + NET_EPOCH_EXIT_ET(et); return (0); } bridge_enqueue(sc, dst_if, m); + NET_EPOCH_EXIT_ET(et); return (0); } @@ -2400,6 +2406,7 @@ static struct mbuf * bridge_input(struct ifnet *ifp, struct mbuf *m) { + struct epoch_tracker et; struct bridge_softc *sc = ifp->if_bridge; struct bridge_iflist *bif, *bif2; struct ifnet *bifp; @@ -2408,10 +2415,12 @@ uint16_t vlan; int error; - MPASS(in_epoch(net_epoch_preempt)); + NET_EPOCH_ENTER_ET(et); - if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + if ((sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + NET_EPOCH_EXIT_ET(et); return (m); + } bifp = sc->sc_ifp; vlan = VLANTAGOF(m); @@ -2428,10 +2437,12 @@ if_inc_counter(bifp, IFCOUNTER_IPACKETS, 1); if_inc_counter(bifp, IFCOUNTER_IBYTES, m->m_pkthdr.len); m_freem(m); + NET_EPOCH_EXIT_ET(et); return (NULL); } bif = bridge_lookup_member_if(sc, ifp); if (bif == NULL) { + NET_EPOCH_EXIT_ET(et); return (m); } @@ -2444,11 +2455,13 @@ if (memcmp(eh->ether_dhost, bstp_etheraddr, ETHER_ADDR_LEN) == 0) { bstp_input(&bif->bif_stp, ifp, m); /* consumes mbuf */ + NET_EPOCH_EXIT_ET(et); return (NULL); } if ((bif->bif_flags & IFBIF_STP) && bif->bif_stp.bp_state == BSTP_IFSTATE_DISCARDING) { + NET_EPOCH_EXIT_ET(et); return (m); } @@ -2459,6 +2472,7 @@ */ mc = m_dup(m, M_NOWAIT); if (mc == NULL) { + NET_EPOCH_EXIT_ET(et); return (m); } @@ -2485,11 +2499,13 @@ } /* Return the original packet for local processing. */ + NET_EPOCH_EXIT_ET(et); return (m); } if ((bif->bif_flags & IFBIF_STP) && bif->bif_stp.bp_state == BSTP_IFSTATE_DISCARDING) { + NET_EPOCH_EXIT_ET(et); return (m); } @@ -2539,10 +2555,12 @@ vlan, bif, 0, IFBAF_DYNAMIC); \ if (error && bif->bif_addrmax) { \ m_freem(m); \ + NET_EPOCH_EXIT_ET(et); \ return (NULL); \ } \ } \ m->m_pkthdr.rcvif = iface; \ + NET_EPOCH_EXIT_ET(et); \ return (m); \ } \ \ @@ -2551,6 +2569,7 @@ OR_CARP_CHECK_WE_ARE_SRC((iface)) \ ) { \ m_freem(m); \ + NET_EPOCH_EXIT_ET(et); \ return (NULL); \ } @@ -2581,6 +2600,7 @@ /* Perform the bridge forwarding function. */ bridge_forward(sc, bif, m); + NET_EPOCH_EXIT_ET(et); return (NULL); }