Page MenuHomeFreeBSD

D56942.id177582.diff
No OneTemporary

D56942.id177582.diff

diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -2128,12 +2128,6 @@
if (m->m_pkthdr.csum_flags & CSUM_SND_TAG)
MPASS(m->m_pkthdr.snd_tag->ifp == ifp);
#endif
- /* We need at least one port */
- if (sc->sc_count == 0) {
- m_freem(m);
- if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
- return (ENXIO);
- }
ETHER_BPF_MTAP(ifp, m);
@@ -2150,12 +2144,6 @@
if (m->m_pkthdr.csum_flags & CSUM_SND_TAG)
MPASS(m->m_pkthdr.snd_tag->ifp == ifp);
#endif
- /* We need at least one port */
- if (sc->sc_count == 0) {
- m_freem(m);
- if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
- return (ENXIO);
- }
infiniband_bpf_mtap(ifp, m);
@@ -2421,10 +2409,17 @@
{
struct lagg_port *lp;
uint32_t p;
+ unsigned int count;
p = atomic_fetchadd_32(&sc->sc_seq, 1);
+ count = atomic_load_int(&sc->sc_count);
+ if (__predict_false(count == 0)) {
+ if_inc_counter(sc->sc_ifp, IFCOUNTER_OERRORS, 1);
+ m_freem(m);
+ return (ENETDOWN);
+ }
p /= sc->sc_stride;
- p %= sc->sc_count;
+ p %= count;
lp = CK_SLIST_FIRST(&sc->sc_ports);
while (p--)
@@ -2611,13 +2606,20 @@
struct lagg_lb *lb = (struct lagg_lb *)sc->sc_psc;
struct lagg_port *lp = NULL;
uint32_t p = 0;
+ unsigned int count;
if ((sc->sc_opts & LAGG_OPT_USE_FLOWID) &&
M_HASHTYPE_GET(m) != M_HASHTYPE_NONE)
p = m->m_pkthdr.flowid >> sc->flowid_shift;
else
p = m_ether_tcpip_hash(sc->sc_flags, m, lb->lb_key);
- p %= sc->sc_count;
+ count = atomic_load_int(&sc->sc_count);
+ if (__predict_false(count == 0)) {
+ if_inc_counter(sc->sc_ifp, IFCOUNTER_OERRORS, 1);
+ m_freem(m);
+ return (ENETDOWN);
+ }
+ p %= count;
lp = lb->lb_ports[p];
/*

File Metadata

Mime Type
text/plain
Expires
Sat, May 23, 6:02 AM (3 h, 4 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32975581
Default Alt Text
D56942.id177582.diff (1 KB)

Event Timeline