Page MenuHomeFreeBSD

D25715.id74620.diff
No OneTemporary

D25715.id74620.diff

Index: sys/net/if_bridge.c
===================================================================
--- sys/net/if_bridge.c
+++ 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);
}
@@ -1467,9 +1467,9 @@
bifc->ifbic_len = buflen;
return (0);
}
- BRIDGE_UNLOCK(sc);
- outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
- BRIDGE_LOCK(sc);
+ outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO);
+ if (outbuf == NULL)
+ return (ENOMEM);
count = 0;
buf = outbuf;
@@ -1529,9 +1529,9 @@
count++;
buflen = sizeof(bareq) * count;
- BRIDGE_UNLOCK(sc);
- outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
- BRIDGE_LOCK(sc);
+ outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO);
+ if (outbuf == NULL)
+ return (ENOMEM);
count = 0;
buf = outbuf;
@@ -1857,9 +1857,9 @@
return (0);
}
- BRIDGE_UNLOCK(sc);
- outbuf = malloc(buflen, M_TEMP, M_WAITOK | M_ZERO);
- BRIDGE_LOCK(sc);
+ outbuf = malloc(buflen, M_TEMP, M_NOWAIT | M_ZERO);
+ if (outbuf == NULL)
+ return (ENOMEM);
count = 0;
buf = outbuf;
@@ -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);
}
@@ -3130,6 +3150,7 @@
{
struct bridge_rtnode *brt;
+ MPASS(ctx != NULL);
brt = __containerof(ctx, struct bridge_rtnode, brt_epoch_ctx);
CURVNET_SET(brt->brt_vnet);

File Metadata

Mime Type
text/plain
Expires
Sun, Oct 19, 2:45 AM (14 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23906560
Default Alt Text
D25715.id74620.diff (4 KB)

Event Timeline