this tweaks the bge tx code and marks it mpsafe.

ok?


Index: if_bge.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bge.c,v
retrieving revision 1.380
diff -u -p -r1.380 if_bge.c
--- if_bge.c    29 Nov 2015 20:19:35 -0000      1.380
+++ if_bge.c    28 Dec 2015 12:24:47 -0000
@@ -2994,6 +2994,7 @@ bge_attach(struct device *parent, struct
        ifp = &sc->arpcom.ac_if;
        ifp->if_softc = sc;
        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+       ifp->if_xflags = IFXF_MPSAFE;
        ifp->if_ioctl = bge_ioctl;
        ifp->if_start = bge_start;
        ifp->if_watchdog = bge_watchdog;
@@ -3665,12 +3666,12 @@ bge_txeof(struct bge_softc *sc)
 
        txcnt = atomic_sub_int_nv(&sc->bge_txcnt, freed);
 
-       if (txcnt < BGE_TX_RING_CNT - 16)
-               ifq_clr_oactive(&ifp->if_snd);
-       if (txcnt == 0)
-               ifp->if_timer = 0;
-
        sc->bge_tx_saved_considx = cons;
+
+       if (ifq_is_oactive(&ifp->if_snd))
+               ifq_restart(&ifp->if_snd);
+       else if (txcnt == 0)
+               ifp->if_timer = 0;
 }
 
 int
@@ -3733,12 +3734,6 @@ bge_intr(void *xsc)
 
                /* Check TX ring producer/consumer */
                bge_txeof(sc);
-
-               if (!IFQ_IS_EMPTY(&ifp->if_snd)) {
-                       KERNEL_LOCK();
-                       bge_start(ifp);
-                       KERNEL_UNLOCK();
-               }
        }
 
        return (1);
@@ -4099,12 +4094,12 @@ doit:
        if (i < dmamap->dm_nsegs)
                goto fail_unload;
 
-       bus_dmamap_sync(sc->bge_dmatag, dmamap, 0, dmamap->dm_mapsize,
-           BUS_DMASYNC_PREWRITE);
-
        if (frag == sc->bge_tx_saved_considx)
                goto fail_unload;
 
+       bus_dmamap_sync(sc->bge_dmatag, dmamap, 0, dmamap->dm_mapsize,
+           BUS_DMASYNC_PREWRITE);
+
        sc->bge_rdata->bge_tx_ring[cur].bge_flags |= BGE_TXBDFLAG_END;
        sc->bge_cdata.bge_tx_chain[cur] = m;
        sc->bge_cdata.bge_tx_map[cur] = dmamap;
@@ -4126,16 +4121,14 @@ fail_unload:
 void
 bge_start(struct ifnet *ifp)
 {
-       struct bge_softc *sc;
+       struct bge_softc *sc = ifp->if_softc;
        struct mbuf *m;
        int txinc;
 
-       sc = ifp->if_softc;
-
-       if (!(ifp->if_flags & IFF_RUNNING) || ifq_is_oactive(&ifp->if_snd))
-               return;
-       if (!BGE_STS_BIT(sc, BGE_STS_LINK))
+       if (!BGE_STS_BIT(sc, BGE_STS_LINK)) {
+               IFQ_PURGE(&ifp->if_snd);
                return;
+       }
 
        txinc = 0;
        while (1) {
@@ -4591,7 +4584,6 @@ bge_stop(struct bge_softc *sc, int softo
        timeout_del(&sc->bge_rxtimeout_jumbo);
 
        ifp->if_flags &= ~IFF_RUNNING;
-       ifq_clr_oactive(&ifp->if_snd);
        ifp->if_timer = 0;
 
        if (!softonly) {
@@ -4653,6 +4645,9 @@ bge_stop(struct bge_softc *sc, int softo
        }
 
        intr_barrier(sc->bge_intrhand);
+       ifq_barrier(&ifp->if_snd);
+
+       ifq_clr_oactive(&ifp->if_snd);
 
        /* Free the RX lists. */
        bge_free_rx_ring_std(sc);

Reply via email to