Parallelize bridge_input step 1.85/2
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 22 Nov 2008 05:57:31 +0000 (05:57 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 22 Nov 2008 05:57:31 +0000 (05:57 +0000)
Add a boolean field in bridge_softc to indicate whether we have span ports
to tap packets to.  Once bridge's serializer is removed from bridge_input,
we could push the serializer holding down into bridge_span.

sys/net/bridge/if_bridge.c
sys/net/bridge/if_bridgevar.h

index e328c60..35b36de 100644 (file)
@@ -66,7 +66,7 @@
  * $OpenBSD: if_bridge.c,v 1.60 2001/06/15 03:38:33 itojun Exp $
  * $NetBSD: if_bridge.c,v 1.31 2005/06/01 19:45:34 jdc Exp $
  * $FreeBSD: src/sys/net/if_bridge.c,v 1.26 2005/10/13 23:05:55 thompsa Exp $
- * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.55 2008/11/22 04:30:28 sephe Exp $
+ * $DragonFly: src/sys/net/bridge/if_bridge.c,v 1.56 2008/11/22 05:57:31 sephe Exp $
  */
 
 /*
@@ -1662,6 +1662,8 @@ bridge_ioctl_addspan(struct bridge_softc *sc, void *arg)
 
        LIST_INSERT_HEAD(&sc->sc_spanlist, bif, bif_next);
 
+       sc->sc_span = 1;
+
        return (0);
 }
 
@@ -1685,6 +1687,9 @@ bridge_ioctl_delspan(struct bridge_softc *sc, void *arg)
 
        bridge_delete_span(sc, bif);
 
+       if (LIST_EMPTY(&sc->sc_spanlist))
+               sc->sc_span = 0;
+
        return (0);
 }
 
@@ -1888,7 +1893,8 @@ bridge_output(struct ifnet *ifp, struct mbuf *m)
                struct mbuf *mc;
                int used = 0;
 
-               bridge_span(sc, m);
+               if (sc->sc_span)
+                       bridge_span(sc, m);
 
                /*
                 * Following loop is MPSAFE; nothing is blocking
@@ -1937,8 +1943,8 @@ sendunicast:
        /*
         * XXX Spanning tree consideration here?
         */
-
-       bridge_span(sc, m);
+       if (sc->sc_span)
+               bridge_span(sc, m);
        lwkt_serialize_exit(sc->sc_ifp->if_serializer);
        if ((dst_if->if_flags & IFF_RUNNING) == 0)
                m_freem(m);
@@ -2212,7 +2218,8 @@ bridge_input(struct ifnet *ifp, struct mbuf *m)
        if (bif == NULL)
                goto out;
 
-       bridge_span(sc, m);
+       if (sc->sc_span)
+               bridge_span(sc, m);
 
        if (m->m_flags & (M_BCAST | M_MCAST)) {
                /* Tap off 802.1D packets; they do not get forwarded. */
@@ -2428,9 +2435,6 @@ bridge_span(struct bridge_softc *sc, struct mbuf *m)
        struct ifnet *dst_if;
        struct mbuf *mc;
 
-       if (LIST_EMPTY(&sc->sc_spanlist))
-               return;
-
        LIST_FOREACH(bif, &sc->sc_spanlist, bif_next) {
                dst_if = bif->bif_ifp;
 
index 5328d1f..7e8eb57 100644 (file)
@@ -66,7 +66,7 @@
  * $OpenBSD: if_bridge.h,v 1.14 2001/03/22 03:48:29 jason Exp $
  * $NetBSD: if_bridgevar.h,v 1.4 2003/07/08 07:13:50 itojun Exp $
  * $FreeBSD: src/sys/net/if_bridgevar.h,v 1.4 2005/07/06 01:24:45 thompsa Exp $
- * $DragonFly: src/sys/net/bridge/if_bridgevar.h,v 1.8 2008/11/22 04:30:28 sephe Exp $
+ * $DragonFly: src/sys/net/bridge/if_bridgevar.h,v 1.9 2008/11/22 05:57:31 sephe Exp $
  */
 
 #ifndef _NET_IF_BRIDGEVAR_H
@@ -339,6 +339,7 @@ struct bridge_softc {
        struct bridge_rtnode_head *sc_rtlists;  /* percpu lists of the above */
        uint32_t                sc_rthash_key;  /* key for hash */
        struct bridge_iflist_head sc_spanlist;  /* span ports list */
+       int                     sc_span;        /* has span ports */
        struct bridge_timer     sc_link_timer;
 };
 #define sc_if                   sc_arp.ac_if