Reduce ifnet.if_serializer contention on output path:
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 14 May 2008 11:59:24 +0000 (11:59 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 14 May 2008 11:59:24 +0000 (11:59 +0000)
- Push ifnet.if_serializer holding down into each ifnet.if_output implementation
- Add a serializer into ifaltq, which is used to protect send queue instead of
  its parent's if_serializer.  This change has following implication:
  o  On output path, enqueueing packets and calling ifnet.if_start are decoupled
  o  In device drivers, poll->dev_encap_ok->dequeue operation sequence is no
     longer safe, instead dequeue->dev_encap_fail->prepend should be used
  This serializer will be held by using lwkt_serialize_adaptive_enter()
- Add altq_started field into ifaltq, which is used to interlock the calling
  of its parent's if_start, to reduce ifnet.if_serializer contention.
  if_devstart(), a helper function which utilizes ifaltq.altq_started, is added
  to reduce code duplication in ethernet device drivers.
- Add if_cpuid into ifnet.  This field indicates on which CPU device driver's
  interrupt will happen.
- Add ifq_dispatch().  This function will try to hold ifnet.if_serializer in
  order to call ifnet.if_start.  If this attempt fails, this function will
  schedule ifnet.if_start to be called on CPU located by ifnet.if_start_cpuid
  if_start_nmsg, which is per-CPU netmsg, is added to ifnet to facilitate
  ifnet.if_start scheduling.  ifq_dispatch() is called by ether_output_frame()
  currently
- Use ifq_classic_ functions, if altq is not enabled
- Fix various device drivers bugs in their if_start implementation
- Add ktr for ifq classic enqueue and dequeue
- Add ktr for ifnet.if_start

129 files changed:
sys/conf/options
sys/config/LINT
sys/contrib/ipfilter/netinet/ip_fil.c
sys/dev/netif/acx/if_acx.c
sys/dev/netif/an/if_an.c
sys/dev/netif/an/if_an_isa.c
sys/dev/netif/an/if_an_pccard.c
sys/dev/netif/an/if_an_pci.c
sys/dev/netif/ath/ath/if_ath.c
sys/dev/netif/aue/if_aue.c
sys/dev/netif/axe/if_axe.c
sys/dev/netif/bce/if_bce.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/bwi/if_bwi.c
sys/dev/netif/cs/if_cs.c
sys/dev/netif/cue/if_cue.c
sys/dev/netif/dc/if_dc.c
sys/dev/netif/de/if_de.c
sys/dev/netif/ed/if_ed.c
sys/dev/netif/ed/if_ed_isa.c
sys/dev/netif/ed/if_ed_pccard.c
sys/dev/netif/ed/if_ed_pci.c
sys/dev/netif/em/if_em.c
sys/dev/netif/ep/if_ep.c
sys/dev/netif/ep/if_ep_eisa.c
sys/dev/netif/ep/if_ep_isa.c
sys/dev/netif/ep/if_ep_pccard.c
sys/dev/netif/et/if_et.c
sys/dev/netif/ex/if_ex.c
sys/dev/netif/ex/if_ex_isa.c
sys/dev/netif/ex/if_ex_pccard.c
sys/dev/netif/fe/if_fe.c
sys/dev/netif/fwe/if_fwe.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/ie/if_ie.c
sys/dev/netif/iwi/if_iwi.c
sys/dev/netif/iwl/iwl2100.c
sys/dev/netif/kue/if_kue.c
sys/dev/netif/le/if_le.c
sys/dev/netif/lge/if_lge.c
sys/dev/netif/lge/if_lgereg.h
sys/dev/netif/lnc/am7990.c
sys/dev/netif/lnc/am79900.c
sys/dev/netif/lnc/if_lnc_isa.c
sys/dev/netif/lnc/if_lnc_pci.c
sys/dev/netif/lnc/lance.c
sys/dev/netif/msk/if_msk.c
sys/dev/netif/my/if_my.c
sys/dev/netif/ndis/if_ndis.c
sys/dev/netif/nfe/if_nfe.c
sys/dev/netif/nge/if_nge.c
sys/dev/netif/pcn/if_pcn.c
sys/dev/netif/ral/rt2560.c
sys/dev/netif/ral/rt2661.c
sys/dev/netif/re/if_re.c
sys/dev/netif/rl/if_rl.c
sys/dev/netif/rtw/rtw.c
sys/dev/netif/rue/if_rue.c
sys/dev/netif/rum/if_rum.c
sys/dev/netif/sbni/if_sbni.c
sys/dev/netif/sbni/if_sbni_pci.c
sys/dev/netif/sbsh/if_sbsh.c
sys/dev/netif/sf/if_sf.c
sys/dev/netif/sf/if_sfreg.h
sys/dev/netif/sis/if_sis.c
sys/dev/netif/sk/if_sk.c
sys/dev/netif/sln/if_sln.c
sys/dev/netif/sn/if_sn.c
sys/dev/netif/ste/if_ste.c
sys/dev/netif/stge/if_stge.c
sys/dev/netif/ti/if_ti.c
sys/dev/netif/tl/if_tl.c
sys/dev/netif/tx/if_tx.c
sys/dev/netif/txp/if_txp.c
sys/dev/netif/ural/if_ural.c
sys/dev/netif/vge/if_vge.c
sys/dev/netif/vr/if_vr.c
sys/dev/netif/vx/if_vx.c
sys/dev/netif/vx/if_vx_eisa.c
sys/dev/netif/vx/if_vx_pci.c
sys/dev/netif/wb/if_wb.c
sys/dev/netif/wi/if_wi.c
sys/dev/netif/wl/if_wl.c
sys/dev/netif/xe/if_xe.c
sys/dev/netif/xl/if_xl.c
sys/kern/kern_intr.c
sys/kern/lwkt_serialize.c
sys/net/altq/altq_cbq.c
sys/net/altq/altq_fairq.c
sys/net/altq/altq_hfsc.c
sys/net/altq/altq_priq.c
sys/net/altq/altq_subr.c
sys/net/altq/altq_var.h
sys/net/altq/if_altq.h
sys/net/bpf.c
sys/net/gif/if_gif.c
sys/net/gre/if_gre.c
sys/net/i4b/driver/i4b_ipr.c
sys/net/if.c
sys/net/if_atmsubr.c
sys/net/if_ethersubr.c
sys/net/if_loop.c
sys/net/if_var.h
sys/net/ifq_var.h
sys/net/pf/pf.c
sys/net/ppp/if_ppp.c
sys/net/ppp_layer/ppp_tty.c
sys/net/sl/if_sl.c
sys/net/sppp/if_spppsubr.c
sys/net/stf/if_stf.c
sys/net/tun/if_tun.c
sys/netgraph/fec/ng_fec.c
sys/netgraph/iface/ng_iface.c
sys/netinet/if_ether.c
sys/netinet/ip_flow.c
sys/netinet/ip_output.c
sys/netinet6/ip6_mroute.c
sys/netinet6/nd6.c
sys/netproto/atalk/aarp.c
sys/netproto/atalk/ddp_output.c
sys/netproto/atm/atm_if.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_outputfl.c
sys/netproto/natm/natm.c
sys/netproto/ns/ns_ip.c
sys/netproto/ns/ns_output.c
sys/sys/interrupt.h
sys/sys/serialize.h

index bcc6de8..3806ed6 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/options,v 1.191.2.53 2003/06/04 17:56:58 sam Exp $
-# $DragonFly: src/sys/conf/options,v 1.84 2008/05/02 07:40:32 sephe Exp $
+# $DragonFly: src/sys/conf/options,v 1.85 2008/05/14 11:59:18 sephe Exp $
 #
 #        On the handling of kernel options
 #
@@ -527,6 +527,8 @@ KTR_IF_EM                   opt_ktr.h
 KTR_TESTLOG                    opt_ktr.h
 KTR_SERIALIZER                 opt_ktr.h
 KTR_POLLING                    opt_ktr.h
+KTR_IFQ                                opt_ktr.h
+KTR_IF_START                   opt_ktr.h
 
 # bce driver
 BCE_DEBUG              opt_bce.h
index c373351..75d3ddb 100644 (file)
@@ -3,7 +3,7 @@
 #      as much of the source tree as it can.
 #
 # $FreeBSD: src/sys/i386/conf/LINT,v 1.749.2.144 2003/06/04 17:56:59 sam Exp $
-# $DragonFly: src/sys/config/LINT,v 1.160 2008/05/02 07:40:32 sephe Exp $
+# $DragonFly: src/sys/config/LINT,v 1.161 2008/05/14 11:59:18 sephe Exp $
 #
 # NB: You probably don't want to try running a kernel built from this
 # file.  Instead, you should start from GENERIC, and add options from
@@ -2747,6 +2747,8 @@ options   KTR
 #options KTR_GIANT_CONTENTION
 #options KTR_IF_BGE
 #options KTR_IF_EM
+#options KTR_IF_START
+#options KTR_IFQ
 #options KTR_IPIQ
 #options KTR_MEMORY
 #options KTR_SERIALIZER
index 88154bc..2be449d 100644 (file)
@@ -6,7 +6,7 @@
  * @(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed
  * @(#)$Id: ip_fil.c,v 2.42.2.60 2002/08/28 12:40:39 darrenr Exp $
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.25.2.7 2004/07/04  09:24:38 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.26 2006/12/23 00:27:02 swildner Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.27 2008/05/14 11:59:18 sephe Exp $
  */
 #ifndef        SOLARIS
 #define        SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
@@ -1874,17 +1874,13 @@ frdest_t *fdp;
 #  ifdef IRIX
                IFNET_UPPERLOCK(ifp);
 #  endif
-               lwkt_serialize_enter(ifp->if_serializer);
-               error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst,
-                                         ro->ro_rt);
-               lwkt_serialize_exit(ifp->if_serializer);
+               error = ifp->if_output(ifp, m, (struct sockaddr *)dst,
+                                      ro->ro_rt);
 #  ifdef IRIX
                IFNET_UPPERUNLOCK(ifp);
 #  endif
 # else
-               lwkt_serialize_enter(ifp->if_serializer);
-               error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst);
-               lwkt_serialize_exit(ifp->if_serializer);
+               error = ifp->if_output(ifp, m, (struct sockaddr *)dst);
 # endif
                goto done;
        }
@@ -1974,15 +1970,13 @@ sendorfree:
                m0 = m->m_act;
                m->m_act = 0;
                if (error == 0) {
-                       lwkt_serialize_enter(ifp->if_serializer);
 # if (BSD >= 199306) || (defined(IRIX) && (IRIX >= 605))
-                       error = (*ifp->if_output)(ifp, m,
+                       error = ifp->if_output(ifp, m,
                            (struct sockaddr *)dst, ro->ro_rt);
 # else
-                       error = (*ifp->if_output)(ifp, m,
+                       error = ifp->if_output(ifp, m,
                            (struct sockaddr *)dst);
 # endif
-                       lwkt_serialize_exit(ifp->if_serializer);
                } else {
                        m_freem(m);
                }
index c4c0a6f..34c839b 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/acx/if_acx.c,v 1.26 2008/02/14 12:53:52 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/acx/if_acx.c,v 1.27 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -77,6 +77,7 @@
 #include <sys/kernel.h>
 #include <sys/bus.h>
 #include <sys/firmware.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
 #include <sys/rman.h>
@@ -532,6 +533,9 @@ acx_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
 
@@ -1085,8 +1089,13 @@ acx_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if ((sc->sc_flags & ACX_FLAG_FW_LOADED) == 0 ||
-           (ifp->if_flags & IFF_RUNNING) == 0 ||
+       if ((sc->sc_flags & ACX_FLAG_FW_LOADED) == 0) {
+               ifq_purge(&ifp->if_snd);
+               ieee80211_drain_mgtq(&ic->ic_mgtq);
+               return;
+       }
+
+       if ((ifp->if_flags & IFF_RUNNING) == 0 ||
            (ifp->if_flags & IFF_OACTIVE))
                return;
 
@@ -1130,8 +1139,10 @@ acx_start(struct ifnet *ifp)
                } else if (!ifq_is_empty(&ifp->if_snd)) {
                        struct ether_header *eh;
 
-                       if (ic->ic_state != IEEE80211_S_RUN)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
 
                        m = ifq_dequeue(&ifp->if_snd, NULL);
                        if (m == NULL)
@@ -1345,7 +1356,7 @@ acx_txeof(struct acx_softc *sc)
 
        if (bd->tx_used_count != ACX_TX_DESC_CNT) {
                ifp->if_flags &= ~IFF_OACTIVE;
-               acx_start(ifp);
+               ifp->if_start(ifp);
        }
 }
 
index 08b1e11..1ab8055 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an.c,v 1.2.2.13 2003/02/11 03:32:48 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.42 2007/04/07 11:01:06 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.43 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -1181,9 +1181,7 @@ an_intr(void *xsc)
        CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), AN_INTRS(sc->mpi350));
 
        if ((ifp->if_flags & IFF_UP) && !ifq_is_empty(&ifp->if_snd))
-               an_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static int
@@ -2492,8 +2490,10 @@ an_start(struct ifnet *ifp)
        if (ifp->if_flags & IFF_OACTIVE)
                return;
 
-       if (!sc->an_associated)
+       if (!sc->an_associated) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        /* We can't send in monitor mode so toss any attempts. */
        if (sc->an_monitor && (ifp->if_flags & IFF_PROMISC)) {
@@ -2699,12 +2699,11 @@ an_shutdown(device_t dev)
 void
 an_resume(device_t dev)
 {
-       struct an_softc         *sc;
-       struct ifnet            *ifp;
-       int                     i;
+       struct an_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
+       int i;
 
-       sc = device_get_softc(dev);
-       ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
 
        an_reset(sc);
        if (sc->mpi350)
@@ -2721,9 +2720,9 @@ an_resume(device_t dev)
        }
 
        if (ifp->if_flags & IFF_UP)
-               an_start(ifp);
+               if_devstart(ifp);
 
-       return;
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 #ifdef ANCACHE
index 95b8ae2..006b71d 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_isa.c,v 1.1.2.5 2003/02/01 03:25:12 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_isa.c,v 1.16 2006/10/25 20:55:55 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_isa.c,v 1.17 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -52,7 +52,7 @@
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
-
+#include <sys/interrupt.h>
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
@@ -103,6 +103,7 @@ static int
 an_attach_isa(device_t dev)
 {
        struct an_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
        int flags = device_get_flags(dev);
        int error;
 
@@ -125,6 +126,9 @@ an_attach_isa(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 
 fail:
index 194bbf9..7902fbe 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_pccard.c,v 1.1.2.6 2003/02/01 03:25:12 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_pccard.c,v 1.15 2006/10/25 20:55:55 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_pccard.c,v 1.16 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -51,7 +51,7 @@
 #include <sys/systm.h>
 #include <sys/socket.h>
 #include <sys/kernel.h>
-
+#include <sys/interrupt.h>
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
@@ -143,6 +143,7 @@ static int
 an_pccard_attach(device_t dev)
 {
        struct an_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
        int flags = device_get_flags(dev);
        int error;
 
@@ -167,6 +168,10 @@ an_pccard_attach(device_t dev)
                ifmedia_removeall(&sc->an_ifmedia);
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 
 fail:
index 07d77db..e2f95ce 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_pci.c,v 1.2.2.8 2003/02/11 03:32:48 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_pci.c,v 1.20 2006/10/25 20:55:55 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_pci.c,v 1.21 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -66,7 +66,7 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
-
+#include <sys/interrupt.h>
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
@@ -139,9 +139,11 @@ static int
 an_attach_pci(device_t dev)
 {
        struct an_softc         *sc;
+       struct ifnet            *ifp;
        int                     flags, error;
 
        sc = device_get_softc(dev);
+       ifp = &sc->arpcom.ac_if;
        flags = device_get_flags(dev);
 
        error = an_alloc_port(dev, sc->port_rid, 1);
@@ -211,6 +213,9 @@ an_attach_pci(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
index 8e6b379..905c54e 100644 (file)
@@ -34,7 +34,7 @@
  * THE POSSIBILITY OF SUCH DAMAGES.
  *
  * $FreeBSD: src/sys/dev/ath/if_ath.c,v 1.94.2.23 2006/07/10 01:15:24 sam Exp $
- * $DragonFly: src/sys/dev/netif/ath/ath/if_ath.c,v 1.8 2007/09/15 21:24:59 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ath/ath/if_ath.c,v 1.9 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -62,6 +62,7 @@
 #include <sys/serialize.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
+#include <sys/interrupt.h>
  
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -646,6 +647,9 @@ ath_attach(uint16_t devid, struct ath_softc *sc)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
        ath_announce(sc);
@@ -748,7 +752,7 @@ ath_resume(struct ath_softc *sc)
        if (ifp->if_flags & IFF_UP) {
                ath_init(sc);
                if (ifp->if_flags & IFF_RUNNING)
-                       ath_start(ifp);
+                       ifp->if_start(ifp);
        }
        if (sc->sc_softled) {
                ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin);
@@ -1179,7 +1183,7 @@ ath_reset(struct ifnet *ifp)
                ath_beacon_config(sc);  /* restart beacons */
        ath_hal_intrset(ah, sc->sc_imask);
 
-       ath_start(ifp);                 /* restart xmit */
+       ifp->if_start(ifp);     /* restart xmit */
        return 0;
 }
 
@@ -1195,7 +1199,13 @@ ath_start(struct ifnet *ifp)
        struct ieee80211_frame *wh;
        struct ether_header *eh;
 
-       if ((ifp->if_flags & IFF_RUNNING) == 0 || sc->sc_invalid)
+       if (sc->sc_invalid) {
+               ifq_purge(&ifp->if_snd);
+               ieee80211_drain_mgtq(&ic->ic_mgtq);
+               return;
+       }
+
+       if ((ifp->if_flags & IFF_RUNNING) == 0)
                return;
 
        for (;;) {
@@ -1228,6 +1238,7 @@ ath_start(struct ifnet *ifp)
                                    ieee80211_state_name[ic->ic_state]);
                                sc->sc_stats.ast_tx_discard++;
                                STAILQ_INSERT_TAIL(&sc->sc_txbuf, bf, bf_list);
+                               ifq_purge(&ifp->if_snd);
                                break;
                        }
                        m = ifq_dequeue(&ifp->if_snd, NULL);
@@ -4043,7 +4054,7 @@ ath_tx_proc_q0(struct ath_softc *sc)
        if (sc->sc_softled)
                ath_led_event(sc, ATH_LED_TX);
 
-       ath_start(ifp);
+       ifp->if_start(ifp);
 }
 
 /*
@@ -4079,7 +4090,7 @@ ath_tx_proc_q0123(struct ath_softc *sc)
        if (sc->sc_softled)
                ath_led_event(sc, ATH_LED_TX);
 
-       ath_start(ifp);
+       ifp->if_start(ifp);
 }
 
 /*
@@ -4107,7 +4118,7 @@ ath_tx_proc(struct ath_softc *sc)
        if (sc->sc_softled)
                ath_led_event(sc, ATH_LED_TX);
 
-       ath_start(ifp);
+       ifp->if_start(ifp);
 }
 
 static void
index f1816b8..acc1410 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_aue.c,v 1.78 2003/12/17 14:23:07 sanpei Exp $
- * $DragonFly: src/sys/dev/netif/aue/if_aue.c,v 1.37 2008/01/06 16:55:50 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/aue/if_aue.c,v 1.38 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -962,7 +962,8 @@ aue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
        usb_ether_input(m);
        aue_rxstart(ifp);
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
+
        AUE_UNLOCK(sc);
        return;
 done:
@@ -1020,7 +1021,7 @@ aue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 
        AUE_UNLOCK(sc);
 
@@ -1051,7 +1052,7 @@ aue_tick(void *xsc)
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                sc->aue_link++;
                if (!ifq_is_empty(&ifp->if_snd))
-                       aue_start(ifp);
+                       if_devstart(ifp);
        }
 
        callout_reset(&sc->aue_stat_timer, hz, aue_tick, sc);
@@ -1113,6 +1114,7 @@ aue_start(struct ifnet *ifp)
        AUE_LOCK(sc);
 
        if (!sc->aue_link) {
+               ifq_purge(&ifp->if_snd);
                AUE_UNLOCK(sc);
                return;
        }
@@ -1122,18 +1124,18 @@ aue_start(struct ifnet *ifp)
                return;
        }
 
-       m_head = ifq_poll(&ifp->if_snd);
+       m_head = ifq_dequeue(&ifp->if_snd, NULL);
        if (m_head == NULL) {
                AUE_UNLOCK(sc);
                return;
        }
 
        if (aue_encap(sc, m_head, 0)) {
+               /* aue_encap() will free m_head, if we reach here */
                ifp->if_flags |= IFF_OACTIVE;
                AUE_UNLOCK(sc);
                return;
        }
-       ifq_dequeue(&ifp->if_snd, m_head);
 
        /*
         * If there's a BPF listener, bounce a copy of this frame
@@ -1365,7 +1367,7 @@ aue_watchdog(struct ifnet *ifp)
        aue_txeof(c->aue_xfer, c, stat);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               aue_start(ifp);
+               if_devstart(ifp);
        AUE_UNLOCK(sc);
        return;
 }
index 8f81f27..91fcc7f 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_axe.c,v 1.10 2003/12/08 07:54:14 obrien Exp $
- * $DragonFly: src/sys/dev/netif/axe/if_axe.c,v 1.27 2008/01/06 16:55:50 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/axe/if_axe.c,v 1.28 2008/05/14 11:59:18 sephe Exp $
  */
 /*
  * ASIX Electronics AX88172 USB 2.0 ethernet driver. Used in the
@@ -696,7 +696,8 @@ axe_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
+
        lwkt_serialize_exit(ifp->if_serializer);
 }
 
@@ -717,7 +718,7 @@ axe_tick(void *xsc)
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                sc->axe_link++;
                if (!ifq_is_empty(&ifp->if_snd))
-                       axe_start(ifp);
+                       if_devstart(ifp);
        }
        callout_reset(&sc->axe_stat_timer, hz, axe_tick, sc);
        lwkt_serialize_exit(ifp->if_serializer);
@@ -761,6 +762,7 @@ axe_start(struct ifnet *ifp)
        struct mbuf *m_head = NULL;
 
        if (!sc->axe_link) {
+               ifq_purge(&ifp->if_snd);
                return;
        }
 
@@ -768,16 +770,15 @@ axe_start(struct ifnet *ifp)
                return;
        }
 
-       m_head = ifq_poll(&ifp->if_snd);
-       if (m_head == NULL) {
+       m_head = ifq_dequeue(&ifp->if_snd, NULL);
+       if (m_head == NULL)
                return;
-       }
 
        if (axe_encap(sc, m_head, 0)) {
+               /* axe_encap() will free m_head, if we reach here */
                ifp->if_flags |= IFF_OACTIVE;
                return;
        }
-       ifq_dequeue(&ifp->if_snd, m_head);
 
        /*
         * If there's a BPF listener, bounce a copy of this frame
@@ -953,7 +954,7 @@ axe_watchdog(struct ifnet *ifp)
        axe_txeof(c->axe_xfer, c, stat);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               axe_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 3299cd7..81f3453 100644 (file)
@@ -28,7 +28,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bce/if_bce.c,v 1.31 2007/05/16 23:34:11 davidch Exp $
- * $DragonFly: src/sys/dev/netif/bce/if_bce.c,v 1.3 2008/03/10 12:59:51 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bce/if_bce.c,v 1.4 2008/05/14 11:59:18 sephe Exp $
  */
 
 /*
@@ -50,6 +50,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/queue.h>
@@ -744,6 +745,9 @@ bce_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->bce_res_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        /* Print some important debugging info. */
        DBRUN(BCE_INFO, bce_dump_driver_state(sc));
 
@@ -4471,8 +4475,12 @@ bce_start(struct ifnet *ifp)
        ASSERT_SERIALIZED(ifp->if_serializer);
 
        /* If there's no link or the transmit queue is empty then just exit. */
-       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING ||
-           !sc->bce_link)
+       if (!sc->bce_link) {
+               ifq_purge(&ifp->if_snd);
+               return;
+       }
+
+       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return;
 
        DBPRINT(sc, BCE_INFO_SEND,
@@ -4666,7 +4674,7 @@ bce_watchdog(struct ifnet *ifp)
        ifp->if_oerrors++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 
@@ -4753,7 +4761,7 @@ bce_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
 
        /* Check for new frames to transmit. */
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 #endif /* DEVICE_POLLING */
@@ -4896,7 +4904,7 @@ bce_intr(void *xsc)
 
        /* Handle any frames that arrived while handling the interrupt. */
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 
@@ -5252,7 +5260,7 @@ bce_tick_serialized(struct bce_softc *sc)
                sc->bce_link++;
                /* Now that link is up, handle any outstanding TX traffic. */
                if (!ifq_is_empty(&ifp->if_snd))
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
        }
 }
 
index a1920f6..b66013c 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bfe/if_bfe.c 1.4.4.7 2004/03/02 08:41:33 julian Exp  v
- * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.32 2008/03/23 09:44:36 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.33 2008/05/14 11:59:18 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -37,6 +37,7 @@
 #include <sys/sockio.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
+#include <sys/interrupt.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/queue.h>
@@ -331,6 +332,7 @@ bfe_attach(device_t dev)
        sc->bfe_dev = dev;
        callout_init(&sc->bfe_stat_timer);
 
+#ifndef BURN_BRIDGES
        /*
         * Handle power management nonsense.
         */
@@ -351,6 +353,7 @@ bfe_attach(device_t dev)
                pci_write_config(dev, BFE_PCI_MEMLO, membase, 4);
                pci_write_config(dev, BFE_PCI_INTLINE, irq, 4);
        }
+#endif /* !BURN_BRIDGE */
 
        /*
         * Map control/status registers.
@@ -428,6 +431,9 @@ bfe_attach(device_t dev)
                device_printf(dev, "couldn't set up irq\n");
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->bfe_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
        return 0;
 fail:
        bfe_detach(dev);
@@ -1194,7 +1200,7 @@ bfe_intr(void *xsc)
 
        /* We have packets pending, fire them out */ 
        if ((ifp->if_flags & IFF_RUNNING) && !ifq_is_empty(&ifp->if_snd))
-               bfe_start(ifp);
+               if_devstart(ifp);
 }
 
 static int
@@ -1301,8 +1307,10 @@ bfe_start(struct ifnet *ifp)
         * Not much point trying to send if the link is down
         * or we have nothing to send.
         */
-       if (!sc->bfe_link)
+       if (!sc->bfe_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        if (ifp->if_flags & IFF_OACTIVE)
                return;
index d7fb712..a577138 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.39 2005/07/03 03:41:18 silby Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.90 2008/03/10 12:59:51 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.91 2008/05/14 11:59:18 sephe Exp $
  *
  */
 
@@ -78,6 +78,7 @@
 #include <sys/endian.h>
 #include <sys/kernel.h>
 #include <sys/ktr.h>
+#include <sys/interrupt.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/queue.h>
@@ -1955,6 +1956,10 @@ bge_attach(device_t dev)
                device_printf(dev, "couldn't set up irq\n");
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->bge_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 fail:
        bge_detach(dev);
@@ -2375,7 +2380,7 @@ bge_txeof(struct bge_softc *sc)
                ifp->if_timer = 0;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 #ifdef DEVICE_POLLING
@@ -2727,7 +2732,7 @@ bge_start(struct ifnet *ifp)
 
        need_trans = 0;
        while (sc->bge_cdata.bge_tx_chain[prodidx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
@@ -2744,11 +2749,12 @@ bge_start(struct ifnet *ifp)
                 * chain at once.
                 * (paranoia -- may not actually be needed)
                 */
-               if (m_head->m_flags & M_FIRSTFRAG &&
-                   m_head->m_pkthdr.csum_flags & (CSUM_DELAY_DATA)) {
+               if ((m_head->m_flags & M_FIRSTFRAG) &&
+                   (m_head->m_pkthdr.csum_flags & CSUM_DELAY_DATA)) {
                        if ((BGE_TX_RING_CNT - sc->bge_txcnt) <
-                           m_head->m_pkthdr.csum_data + 16) {
+                           m_head->m_pkthdr.csum_data + BGE_NSEG_RSVD) {
                                ifp->if_flags |= IFF_OACTIVE;
+                               ifq_prepend(&ifp->if_snd, m_head);
                                break;
                        }
                }
@@ -2762,15 +2768,10 @@ bge_start(struct ifnet *ifp)
                if ((BGE_TX_RING_CNT - sc->bge_txcnt) <
                    (BGE_NSEG_RSVD + BGE_NSEG_SPARE)) {
                        ifp->if_flags |= IFF_OACTIVE;
+                       ifq_prepend(&ifp->if_snd, m_head);
                        break;
                }
 
-               /*
-                * Dequeue the packet before encapsulation, since
-                * bge_encap() may free the packet if error happens.
-                */
-               ifq_dequeue(&ifp->if_snd, m_head);
-
                /*
                 * Pack the data into the transmit ring. If we
                 * don't have room, set the OACTIVE flag and wait
@@ -3093,7 +3094,7 @@ bge_watchdog(struct ifnet *ifp)
        ifp->if_oerrors++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -3242,7 +3243,7 @@ bge_resume(device_t dev)
                bge_init(sc);
 
                if (!ifq_is_empty(&ifp->if_snd))
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
        }
 
        lwkt_serialize_exit(ifp->if_serializer);
index ed08a81..90f4b59 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/bwi/if_bwi.c,v 1.20 2008/02/15 11:48:15 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/bwi/if_bwi.c,v 1.21 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -39,6 +39,7 @@
 #include <sys/endian.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
 #include <sys/rman.h>
@@ -814,6 +815,9 @@ bwi_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
 
@@ -1510,7 +1514,7 @@ back:
        if (error)
                bwi_stop(sc, 1);
        else
-               bwi_start(ifp);
+               ifp->if_start(ifp);
 }
 
 static int
@@ -1601,8 +1605,10 @@ bwi_start(struct ifnet *ifp)
                } else if (!ifq_is_empty(&ifp->if_snd)) {
                        struct ether_header *eh;
 
-                       if (ic->ic_state != IEEE80211_S_RUN)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
 
                        m = ifq_dequeue(&ifp->if_snd, NULL);
                        if (m == NULL)
@@ -2706,7 +2712,9 @@ static int
 bwi_set_chan(struct bwi_softc *sc, struct ieee80211_channel *c)
 {
        struct ieee80211com *ic = &sc->sc_ic;
+#ifdef INVARIANTS
        struct ifnet *ifp = &ic->ic_if;
+#endif
        struct bwi_mac *mac;
        uint16_t flags;
        u_int chan;
index 7a4c5ef..47f7064 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/cs/if_cs.c,v 1.19.2.1 2001/01/25 20:13:48 imp Exp $
- * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.28 2006/12/22 23:26:19 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.29 2008/05/14 11:59:19 sephe Exp $
  */
 
 /*
@@ -39,6 +39,7 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
@@ -684,6 +685,9 @@ cs_attach(device_t dev)
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 
 bad:
@@ -797,7 +801,7 @@ cs_init(void *xsc)
        /*
         * Start sending process
         */
-       cs_start(ifp);
+       if_devstart(&sc->arpcom.ac_if);
 }
 
 /*
@@ -928,9 +932,8 @@ csintr(void *arg)
                 }
         }
 
-        if (!(ifp->if_flags & IFF_OACTIVE)) {
-                cs_start(ifp);
-        }
+        if (!(ifp->if_flags & IFF_OACTIVE))
+               if_devstart(ifp);
 }
 
 /*
index 7c7a890..5a16abf 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_cue.c,v 1.45 2003/12/08 07:54:14 obrien Exp $
- * $DragonFly: src/sys/dev/netif/cue/if_cue.c,v 1.31 2007/11/06 07:37:00 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/cue/if_cue.c,v 1.32 2008/05/14 11:59:19 sephe Exp $
  */
 
 /*
@@ -739,7 +739,7 @@ cue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 
        CUE_UNLOCK(sc);
 
@@ -826,18 +826,18 @@ cue_start(struct ifnet *ifp)
                return;
        }
 
-       m_head = ifq_poll(&ifp->if_snd);
+       m_head = ifq_dequeue(&ifp->if_snd, NULL);
        if (m_head == NULL) {
                CUE_UNLOCK(sc);
                return;
        }
 
        if (cue_encap(sc, m_head, 0)) {
+               /* cue_encap() will free m_head, if we reach here */
                ifp->if_flags |= IFF_OACTIVE;
                CUE_UNLOCK(sc);
                return;
        }
-       ifq_dequeue(&ifp->if_snd, m_head);
 
        /*
         * If there's a BPF listener, bounce a copy of this frame
@@ -1018,7 +1018,7 @@ cue_watchdog(struct ifnet *ifp)
        cue_txeof(c->cue_xfer, c, stat);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               cue_start(ifp);
+               if_devstart(ifp);
        CUE_UNLOCK(sc);
 
        return;
index cf6b864..4a86e27 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_dc.c,v 1.9.2.45 2003/06/08 14:31:53 mux Exp $
- * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.55 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.56 2008/05/14 11:59:19 sephe Exp $
  */
 
 /*
@@ -98,6 +98,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/bus.h>
@@ -2180,6 +2181,9 @@ dc_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->dc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -2763,7 +2767,7 @@ dc_tick(void *xsc)
                    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                        sc->dc_link++;
                        if (!ifq_is_empty(&ifp->if_snd))
-                               dc_start(ifp);
+                               if_devstart(ifp);
                }
        }
 
@@ -2848,14 +2852,14 @@ dc_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                dc_rxeof(sc);
                dc_txeof(sc);
                if ((ifp->if_flags & IFF_OACTIVE) == 0 && !ifq_is_empty(&ifp->if_snd))
-                       dc_start(ifp);
+                       if_devstart(ifp);
                break;
        case POLL_AND_CHECK_STATUS:
                sc->rxcycles = count;
                dc_rxeof(sc);
                dc_txeof(sc);
                if ((ifp->if_flags & IFF_OACTIVE) == 0 && !ifq_is_empty(&ifp->if_snd))
-                       dc_start(ifp);
+                       if_devstart(ifp);
                status = CSR_READ_4(sc, DC_ISR);
                status &= (DC_ISR_RX_WATDOGTIMEO|DC_ISR_RX_NOBUF|
                        DC_ISR_TX_NOBUF|DC_ISR_TX_IDLE|DC_ISR_TX_UNDERRUN|
@@ -2967,9 +2971,7 @@ dc_intr(void *arg)
        CSR_WRITE_4(sc, DC_IMR, DC_INTRS);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               dc_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 /*
@@ -3045,14 +3047,15 @@ static void
 dc_start(struct ifnet *ifp)
 {
        struct dc_softc *sc;
-       struct mbuf *m_head;
-       struct mbuf *m_defragged;
+       struct mbuf *m_head, *m_defragged;
        int idx, need_trans;
 
        sc = ifp->if_softc;
 
-       if (!sc->dc_link)
+       if (!sc->dc_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        if (ifp->if_flags & IFF_OACTIVE)
                return;
@@ -3062,13 +3065,12 @@ dc_start(struct ifnet *ifp)
        need_trans = 0;
        while(sc->dc_cdata.dc_tx_chain[idx] == NULL) {
                m_defragged = NULL;
-               m_head = ifq_poll(&ifp->if_snd);
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
-               if (sc->dc_flags & DC_TX_COALESCE &&
-                   (m_head->m_next != NULL ||
-                       sc->dc_flags & DC_TX_ALIGN)){
+               if ((sc->dc_flags & DC_TX_COALESCE) &&
+                   (m_head->m_next != NULL || (sc->dc_flags & DC_TX_ALIGN))) {
                        /*
                         * Check first if coalescing allows us to queue
                         * the packet. We don't want to loose it if
@@ -3078,52 +3080,47 @@ dc_start(struct ifnet *ifp)
                            idx != sc->dc_cdata.dc_tx_prod &&
                            idx == (DC_TX_LIST_CNT - 1)) {
                                ifp->if_flags |= IFF_OACTIVE;
+                               ifq_prepend(&ifp->if_snd, m_head);
                                break;
                        }
                        if ((DC_TX_LIST_CNT - sc->dc_cdata.dc_tx_cnt) < 5) {
                                ifp->if_flags |= IFF_OACTIVE;
+                               ifq_prepend(&ifp->if_snd, m_head);
                                break;
                        }
 
                        /* only coalesce if have >1 mbufs */
-                       m_defragged = m_defrag_nofree(m_head, MB_DONTWAIT);
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
                        if (m_defragged == NULL) {
                                ifp->if_flags |= IFF_OACTIVE;
+                               ifq_prepend(&ifp->if_snd, m_head);
                                break;
                        }
+                       m_head = m_defragged;
                }
 
-               if (dc_encap(sc, (m_defragged ? m_defragged : m_head), &idx)) {
+               if (dc_encap(sc, m_head, &idx)) {
                        if (m_defragged) {
                                /*
                                 * Throw away the original packet if the
                                 * defragged packet could not be encapsulated,
                                 * as well as the defragged packet.
                                 */
-                               ifq_dequeue(&ifp->if_snd, m_head);
                                m_freem(m_head);
-                               m_freem(m_defragged);
+                       } else {
+                               ifq_prepend(&ifp->if_snd, m_head);
                        }
                        ifp->if_flags |= IFF_OACTIVE;
                        break;
                }
 
-               ifq_dequeue(&ifp->if_snd, m_head);
-
                need_trans = 1;
 
                /*
                 * If there's a BPF listener, bounce a copy of this frame
                 * to him.
                 */
-               BPF_MTAP(ifp, (m_defragged ? m_defragged : m_head));
-
-               /*
-                * If we defragged the packet, m_head is not the one we
-                * encapsulated so we can throw it away.
-                */
-               if (m_defragged)
-                       m_freem(m_head);
+               BPF_MTAP(ifp, m_head);
 
                if (sc->dc_flags & DC_TX_ONE) {
                        ifp->if_flags |= IFF_OACTIVE;
@@ -3432,9 +3429,7 @@ dc_watchdog(struct ifnet *ifp)
        dc_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               dc_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 /*
@@ -3488,11 +3483,8 @@ dc_stop(struct dc_softc *sc)
                        sc->dc_cdata.dc_tx_chain[i] = NULL;
                }
        }
-
        bzero((char *)&sc->dc_ldata->dc_tx_list,
                sizeof(sc->dc_ldata->dc_tx_list));
-
-       return;
 }
 
 /*
index 1bb0912..aec41b3 100644 (file)
@@ -1,7 +1,7 @@
 /*     $NetBSD: if_de.c,v 1.86 1999/06/01 19:17:59 thorpej Exp $       */
 
 /* $FreeBSD: src/sys/pci/if_de.c,v 1.123.2.4 2000/08/04 23:25:09 peter Exp $ */
-/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.47 2006/12/22 23:26:19 swildner Exp $ */
+/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.48 2008/05/14 11:59:19 sephe Exp $ */
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -51,6 +51,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include "opt_inet.h"
 #include "opt_ipx.h"
@@ -58,7 +59,7 @@
 #include <net/if.h>
 #include <net/if_media.h>
 #include <net/if_dl.h>
-
+#include <net/ifq_var.h>
 #include <net/bpf.h>
 
 #ifdef INET
@@ -3426,7 +3427,7 @@ tulip_intr_handler(tulip_softc_t *sc)
        if (sc->tulip_flags & (TULIP_WANTTXSTART|TULIP_TXPROBE_ACTIVE|TULIP_DOINGSETUP|TULIP_PROMISC)) {
            tulip_tx_intr(sc);
            if ((sc->tulip_flags & TULIP_TXPROBE_ACTIVE) == 0)
-               tulip_ifstart(&sc->tulip_if);
+               if_devstart(&sc->tulip_if);
        }
     }
     if (sc->tulip_flags & TULIP_NEEDRESET) {
@@ -3854,9 +3855,15 @@ tulip_ifstart(struct ifnet *ifp)
 
        while (sc->tulip_if.if_snd.ifq_head != NULL) {
            struct mbuf *m;
+
+           ALTQ_LOCK(&sc->tulip_if.if_snd);
            IF_DEQUEUE(&sc->tulip_if.if_snd, m);
+           ALTQ_UNLOCK(&sc->tulip_if.if_snd);
+
            if ((m = tulip_txput(sc, m)) != NULL) {
+               ALTQ_LOCK(&sc->tulip_if.if_snd);
                IF_PREPEND(&sc->tulip_if.if_snd, m);
+               ALTQ_UNLOCK(&sc->tulip_if.if_snd);
                break;
            }
        }
@@ -4191,6 +4198,10 @@ tulip_pci_attach(device_t dev)
                kfree((caddr_t) sc->tulip_txdescs, M_DEVBUF);
                return ENXIO;
            }
+
+           sc->tulip_if.if_cpuid = ithread_cpuid(rman_get_start(res));
+           KKASSERT(sc->tulip_if.if_cpuid >= 0 &&
+                    sc->tulip_if.if_cpuid < ncpus);
        }
     }
     return 0;
index d80e41a..60159a1 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed.c,v 1.224 2003/12/08 07:54:12 obrien Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed.c,v 1.34 2007/05/13 18:33:57 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed.c,v 1.35 2008/05/14 11:59:19 sephe Exp $
  */
 
 /*
@@ -1991,7 +1991,7 @@ ed_init(void *xsc)
        /*
         * ...and attempt to start output
         */
-       ed_start(ifp);
+       if_devstart(ifp);
 
 #ifndef ED_NO_MIIBUS
        callout_reset(&sc->ed_timer, hz, ed_tick, sc);
@@ -2068,6 +2068,7 @@ ed_start(struct ifnet *ifp)
 
        if (sc->gone) {
                kprintf("ed_start(%p) GONE\n",ifp);
+               ifq_purge(&ifp->if_snd);
                return;
        }
 outloop:
@@ -2580,7 +2581,7 @@ edintr(void *arg)
                 * after handling the receiver to give the receiver priority.
                 */
                if ((ifp->if_flags & IFF_OACTIVE) == 0)
-                       ed_start(ifp);
+                       if_devstart(ifp);
 
                /*
                 * return NIC CR to standard state: page 0, remote DMA
index 78d5fdb..3e7536e 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_isa.c,v 1.15 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.15 2006/10/25 20:55:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.16 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -34,6 +34,8 @@
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/interrupt.h>
+#include <sys/rman.h>
 
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -130,11 +132,18 @@ ed_isa_attach(device_t dev)
 
        error = ed_attach(dev);
        if (error == 0) {
+               struct ifnet *ifp = &sc->arpcom.ac_if;
+
                error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
                                       edintr, sc, &sc->irq_handle,
-                                      sc->arpcom.ac_if.if_serializer);
-               if (error)
+                                      ifp->if_serializer);
+               if (error) {
                        ed_isa_detach(dev);
+               } else {
+                       ifp->if_cpuid =
+                               ithread_cpuid(rman_get_start(sc->irq_res));
+                       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+               }
        } else {
                ed_release_resources(dev);
        }
index 25017e5..cc31366 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pccard.c,v 1.55 2003/12/31 04:25:00 kato Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.20 2007/08/14 15:32:32 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.21 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include "opt_ed.h"
@@ -37,6 +37,7 @@
 #include <sys/conf.h>
 #include <sys/uio.h>
 #include <sys/module.h>
+#include <sys/interrupt.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 
@@ -250,6 +251,7 @@ static int
 ed_pccard_attach(device_t dev)
 {
        struct ed_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
        int error;
        int i;
        uint8_t sum;
@@ -283,11 +285,14 @@ ed_pccard_attach(device_t dev)
 
        error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
                               edintr, sc, &sc->irq_handle,
-                              sc->arpcom.ac_if.if_serializer);
+                              ifp->if_serializer);
        if (error) {
                kprintf("setup intr failed %d \n", error);
                ed_release_resources(dev);
                return (error);
+       } else {
+               ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+               KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
        }
 
        return (error);
index 8a1b3cf..3bd6a86 100644 (file)
@@ -18,7 +18,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.34 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.14 2006/10/25 20:55:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.15 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -26,6 +26,7 @@
 #include <sys/socket.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
+#include <sys/interrupt.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 
@@ -103,11 +104,18 @@ ed_pci_attach(device_t dev)
 
        error = ed_attach(dev);
        if (error == 0) {
+               struct ifnet *ifp = &sc->arpcom.ac_if;
+
                error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
-                                      edintr, sc, &sc->irq_handle, 
-                                      sc->arpcom.ac_if.if_serializer);
-               if (error)
+                                      edintr, sc, &sc->irq_handle,
+                                      ifp->if_serializer);
+               if (error) {
                        ed_pci_detach(dev);
+               } else {
+                       ifp->if_cpuid =
+                               ithread_cpuid(rman_get_start(sc->irq_res));
+                       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+               }
        } else {
                 ed_release_resources(dev);
        }
index 07a7aa6..9aebb86 100644 (file)
@@ -64,7 +64,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.70 2008/05/02 07:40:32 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.71 2008/05/14 11:59:19 sephe Exp $
  * $FreeBSD$
  */
 /*
 #include <sys/param.h>
 #include <sys/bus.h>
 #include <sys/endian.h>
+#include <sys/interrupt.h>
 #include <sys/kernel.h>
 #include <sys/ktr.h>
 #include <sys/malloc.h>
@@ -469,12 +470,14 @@ static int
 em_attach(device_t dev)
 {
        struct adapter *adapter;
+       struct ifnet *ifp;
        int tsize, rsize;
        int error = 0;
 
        INIT_DEBUGOUT("em_attach: begin");
 
        adapter = device_get_softc(dev);
+       ifp = &adapter->interface_data.ac_if;
 
        callout_init(&adapter->timer);
        callout_init(&adapter->tx_fifo_timer);
@@ -678,14 +681,15 @@ em_attach(device_t dev)
 
        error = bus_setup_intr(dev, adapter->res_interrupt, INTR_NETSAFE,
                           em_intr, adapter,
-                          &adapter->int_handler_tag,
-                          adapter->interface_data.ac_if.if_serializer);
+                          &adapter->int_handler_tag, ifp->if_serializer);
        if (error) {
                device_printf(dev, "Error registering interrupt handler!\n");
-               ether_ifdetach(&adapter->interface_data.ac_if);
+               ether_ifdetach(ifp);
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(adapter->res_interrupt));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
        INIT_DEBUGOUT("em_attach: end");
        return(0);
 
@@ -792,8 +796,7 @@ em_resume(device_t dev)
        lwkt_serialize_enter(ifp->if_serializer);
        ifp->if_flags &= ~IFF_RUNNING;
        em_init(adapter);
-       if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
-               em_start(ifp);
+       if_devstart(ifp);
        lwkt_serialize_exit(ifp->if_serializer);
 
        return bus_generic_resume(dev);
@@ -819,20 +822,21 @@ em_start(struct ifnet *ifp)
 
        if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return;
-       if (!adapter->link_active)
+       if (!adapter->link_active) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
        while (!ifq_is_empty(&ifp->if_snd)) {
-               m_head = ifq_poll(&ifp->if_snd);
-
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
                logif(pkt_txqueue);
                if (em_encap(adapter, m_head)) {
                        ifp->if_flags |= IFF_OACTIVE;
+                       ifq_prepend(&ifp->if_snd, m_head);
                        break;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
 
                /* Send a copy of the frame to the BPF listener */
                ETHER_BPF_MTAP(ifp, m_head);
@@ -1179,7 +1183,7 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                        em_txeof(adapter);
 
                        if (!ifq_is_empty(&ifp->if_snd))
-                               em_start(ifp);
+                               if_devstart(ifp);
                }
                break;
        }
@@ -1246,7 +1250,8 @@ em_intr(void *arg)
                adapter->rx_overruns++;
 
        if ((ifp->if_flags & IFF_RUNNING) && !ifq_is_empty(&ifp->if_snd))
-               em_start(ifp);
+               if_devstart(ifp);
+
        logif(intr_end);
 }
 
index 3381629..cfd5c31 100644 (file)
@@ -39,7 +39,7 @@
 
 /*
  * $FreeBSD: src/sys/dev/ep/if_ep.c,v 1.95.2.3 2002/03/06 07:26:35 imp Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep.c,v 1.26 2006/12/22 23:26:19 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep.c,v 1.27 2008/05/14 11:59:19 sephe Exp $
  *
  *  Promiscuous mode added and interrupt logic slightly changed
  *  to reduce the number of adapter failures. Transceiver select
@@ -405,7 +405,8 @@ ep_if_init(void *xsc)
      */
 
     GO_WINDOW(1);
-    ep_if_start(ifp);
+
+    if_devstart(ifp);
 
     crit_exit();
 }
@@ -422,6 +423,7 @@ ep_if_start(struct ifnet *ifp)
     int pad;
 
     if (sc->gone) {
+       ifq_purge(&ifp->if_snd);
        return;
     }
 
@@ -434,7 +436,7 @@ ep_if_start(struct ifnet *ifp)
 
 startagain:
     /* Sneak a peek at the next packet */
-    m = ifq_poll(&ifp->if_snd);
+    m = ifq_dequeue(&ifp->if_snd, NULL);
     if (m == NULL) {
        crit_exit();
        return;
@@ -454,7 +456,6 @@ startagain:
     if (len + pad > ETHER_MAX_LEN) {
        /* packet is obviously too large: toss it */
        ++ifp->if_oerrors;
-       ifq_dequeue(&ifp->if_snd, m);
        m_freem(m);
        goto readcheck;
     }
@@ -464,6 +465,7 @@ startagain:
        /* make sure */
        if (inw(BASE + EP_W1_FREE_TX) < len + pad + 4) {
            ifp->if_flags |= IFF_OACTIVE;
+           ifq_prepend(&ifp->if_snd, top);
            crit_exit();
            return;
        }
@@ -471,8 +473,6 @@ startagain:
        outw(BASE + EP_COMMAND, SET_TX_AVAIL_THRESH | EP_THRESH_DISABLE);
     }
 
-    ifq_dequeue(&ifp->if_snd, m);
-
     outw(BASE + EP_W1_TX_PIO_WR_1, len); 
     outw(BASE + EP_W1_TX_PIO_WR_1, 0x0);       /* Second dword meaningless */
 
@@ -553,7 +553,7 @@ rescan:
            ifp->if_flags &= ~IFF_OACTIVE;
            GO_WINDOW(1);
            inw(BASE + EP_W1_FREE_TX);
-           ep_if_start(ifp);
+           if_devstart(ifp);
        }
        if (status & S_CARD_FAILURE) {
            ifp->if_timer = 0;
@@ -615,7 +615,7 @@ rescan:
            ifp->if_flags &= ~IFF_OACTIVE;
            GO_WINDOW(1);
            inw(BASE + EP_W1_FREE_TX);
-           ep_if_start(ifp);
+           if_devstart(ifp);
        }                       /* end TX_COMPLETE */
     }
 
@@ -881,7 +881,7 @@ ep_if_watchdog(struct ifnet *ifp)
     }
 
     ifp->if_flags &= ~IFF_OACTIVE;
-    ep_if_start(ifp);
+    if_devstart(ifp);
     ep_intr(ifp->if_softc);
 }
 
index 0ff1fd2..235b2c4 100644 (file)
@@ -20,7 +20,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_eisa.c,v 1.18 2000/01/14 07:14:00 peter Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_eisa.c,v 1.12 2006/10/25 20:55:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_eisa.c,v 1.13 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -30,6 +30,7 @@
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/rman.h> 
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -178,6 +179,7 @@ static int
 ep_eisa_attach(device_t dev)
 {
        struct ep_softc *       sc = device_get_softc(dev);
+       struct ifnet *          ifp = &sc->arpcom.ac_if;
        struct resource *       eisa_io = NULL;
        u_int32_t               eisa_iobase;
        int                     irq;
@@ -229,12 +231,15 @@ ep_eisa_attach(device_t dev)
 
        error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
                               ep_intr, sc, &sc->ep_intrhand, 
-                              sc->arpcom.ac_if.if_serializer);
+                              ifp->if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 
  bad:
index 7d927d8..b560573 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_isa.c,v 1.8.2.1 2000/12/16 03:47:57 nyan Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.13 2006/10/25 20:55:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.14 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -36,6 +36,7 @@
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/module.h>
+#include <sys/interrupt.h>
 #include <sys/bus.h>
 #include <sys/rman.h> 
 
@@ -302,6 +303,7 @@ static int
 ep_isa_attach(device_t dev)
 {
        struct ep_softc *       sc = device_get_softc(dev);
+       struct ifnet *          ifp = &sc->arpcom.ac_if;
        int                     error = 0;
 
        if ((error = ep_alloc(dev))) {
@@ -320,13 +322,15 @@ ep_isa_attach(device_t dev)
        }
 
        error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE, ep_intr,
-                              sc, &sc->ep_intrhand, 
-                              sc->arpcom.ac_if.if_serializer);
+                              sc, &sc->ep_intrhand, ifp->if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 bad:
        ep_free(dev);
index 133fbdd..e2822d0 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_pccard.c,v 1.12.2.2 2000/08/08 23:55:02 peter Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.11 2006/10/25 20:55:56 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.12 2008/05/14 11:59:19 sephe Exp $
  */
 
 /*
@@ -42,6 +42,7 @@
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/module.h>
+#include <sys/interrupt.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
  
@@ -156,6 +157,7 @@ static int
 ep_pccard_attach(device_t dev)
 {
        struct ep_softc *       sc = device_get_softc(dev);
+       struct ifnet *          ifp = &sc->arpcom.ac_if;
        int                     error = 0;
 
        if ((error = ep_alloc(dev))) {
@@ -216,6 +218,9 @@ ep_pccard_attach(device_t dev)
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 bad:
        ep_free(dev);
index 1d77433..a0321a0 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/et/if_et.c,v 1.8 2007/12/21 19:13:35 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/et/if_et.c,v 1.9 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -39,6 +39,7 @@
 #include <sys/endian.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
 #include <sys/rman.h>
@@ -378,6 +379,10 @@ et_attach(device_t dev)
                device_printf(dev, "can't setup intr\n");
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 fail:
        et_detach(dev);
@@ -1228,8 +1233,10 @@ et_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if ((sc->sc_flags & ET_FLAG_TXRX_ENABLED) == 0)
+       if ((sc->sc_flags & ET_FLAG_TXRX_ENABLED) == 0) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return;
@@ -1269,7 +1276,7 @@ et_watchdog(struct ifnet *ifp)
        if_printf(ifp, "watchdog timed out\n");
 
        ifp->if_init(ifp->if_softc);
-       ifp->if_start(ifp);
+       if_devstart(ifp);
 }
 
 static int
@@ -2141,7 +2148,7 @@ et_txeof(struct et_softc *sc)
        if (tbd->tbd_used + ET_NSEG_SPARE <= ET_TX_NDESC)
                ifp->if_flags &= ~IFF_OACTIVE;
 
-       ifp->if_start(ifp);
+       if_devstart(ifp);
 }
 
 static void
@@ -2159,7 +2166,7 @@ et_tick(void *xsc)
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                if_printf(ifp, "Link up, enable TX/RX\n");
                if (et_enable_txrx(sc, 0) == 0)
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
        }
        callout_reset(&sc->sc_tick, hz, et_tick, sc);
 
index fb4f2d9..cc66814 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ex/if_ex.c,v 1.26.2.3 2001/03/05 05:33:20 imp Exp $
- * $DragonFly: src/sys/dev/netif/ex/if_ex.c,v 1.24 2006/12/22 23:26:19 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ex/if_ex.c,v 1.25 2008/05/14 11:59:19 sephe Exp $
  *
  * MAINTAINER: Matthew N. Dodd <winter@jurai.net>
  *                             <mdodd@FreeBSD.org>
@@ -352,7 +352,8 @@ ex_init(void *xsc)
        DELAY(2);
        outb(iobase + CMD_REG, Rcv_Enable_CMD);
 
-       ex_start(ifp);
+       if (!ifq_is_empty(&ifp->if_snd))
+               if_devstart(ifp);
 
        DODEBUG(Start_End, kprintf("ex_init%d: finish\n", ifp->if_dunit););
 }
@@ -375,7 +376,7 @@ ex_start(struct ifnet *ifp)
         * more packets left, or the card cannot accept any more yet.
         */
        while ((ifp->if_flags & IFF_OACTIVE) == 0) {
-               opkt = ifq_poll(&ifp->if_snd);
+               opkt = ifq_dequeue(&ifp->if_snd, NULL);
                if (opkt == NULL)
                        break;
 
@@ -410,8 +411,6 @@ ex_start(struct ifnet *ifp)
                DODEBUG(Sent_Pkts, kprintf("i=%d, avail=%d\n", i, avail););
 
                if (avail >= len + XMT_HEADER_LEN) {
-                       ifq_dequeue(&ifp->if_snd, opkt);
-
 #ifdef EX_PSA_INTR      
                        /*
                         * Disable rx and tx interrupts, to avoid corruption
@@ -525,6 +524,7 @@ ex_start(struct ifnet *ifp)
                        m_freem(opkt);
                } else {
                        ifp->if_flags |= IFF_OACTIVE;
+                       ifq_prepend(&ifp->if_snd, opkt);
                        DODEBUG(Status, kprintf("OACTIVE start\n"););
                }
        }
@@ -596,7 +596,7 @@ ex_intr(void *arg)
         */
 
        if (send_pkts && !ifq_is_empty(&ifp->if_snd))
-               ex_start(ifp);
+               if_devstart(ifp);
 
 #ifdef EXDEBUG
        exintr_count--;
@@ -827,7 +827,7 @@ ex_watchdog(struct ifnet *ifp)
 
        ifp->if_oerrors++;
        ex_reset(sc);
-       ex_start(ifp);
+       if_devstart(ifp);
 
        DODEBUG(Start_End, kprintf("ex_watchdog%d: finish\n", ifp->if_dunit););
 
index 2301c73..c075403 100644 (file)
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_isa.c,v 1.3.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.14 2007/04/30 07:18:50 dillon Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.15 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/module.h>
 #include <sys/bus.h>
@@ -239,6 +240,7 @@ static int
 ex_isa_attach(device_t dev)
 {
        struct ex_softc *       sc = device_get_softc(dev);
+       struct ifnet *          ifp = &sc->arpcom.ac_if;
        int                     error = 0;
        u_int16_t               temp;
 
@@ -280,12 +282,15 @@ ex_isa_attach(device_t dev)
 
        error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
                                ex_intr, (void *)sc, &sc->ih, 
-                               sc->arpcom.ac_if.if_serializer);
+                               ifp->if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed!\n");
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 bad:
        ex_release_resources(dev);
index 6865afc..39723ab 100644 (file)
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_pccard.c,v 1.2.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.14 2007/08/14 15:32:32 sephe Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.15 2008/05/14 11:59:19 sephe Exp $
  */
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/module.h>
 #include <sys/bus.h>
@@ -125,6 +126,7 @@ static int
 ex_pccard_attach(device_t dev)
 {
        struct ex_softc *       sc = device_get_softc(dev);
+       struct ifnet *          ifp = &sc->arpcom.ac_if;
        int                     error = 0;
        int                     i;
        uint8_t                 sum;
@@ -161,12 +163,15 @@ ex_pccard_attach(device_t dev)
 
        error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
                                ex_intr, (void *)sc, &sc->ih, 
-                               sc->arpcom.ac_if.if_serializer);
+                               ifp->if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed!\n");
                goto bad;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 bad:
        ex_release_resources(dev);
index c1e8e3c..9578fc9 100644 (file)
@@ -22,7 +22,7 @@
 
 /*
  * $FreeBSD: src/sys/dev/fe/if_fe.c,v 1.65.2.1 2000/09/22 10:01:47 nyan Exp $
- * $DragonFly: src/sys/dev/netif/fe/if_fe.c,v 1.28 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/fe/if_fe.c,v 1.29 2008/05/14 11:59:20 sephe Exp $
  *
  * Device driver for Fujitsu MB86960A/MB86965A based Ethernet cards.
  * Contributed by M. Sekiguchi. <seki@sysrap.cs.fujitsu.co.jp>
@@ -821,6 +821,8 @@ fe_attach (device_t dev)
                return ENXIO;
        }
 
+       sc->sc_if.if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(sc->sc_if.if_cpuid >= 0 && sc->sc_if.if_cpuid < ncpus);
   
        /* Print additional info when attached.  */
        device_printf(dev, "type %s%s\n", sc->typestr,
@@ -1108,7 +1110,7 @@ fe_init (void * xsc)
            the interface keeping it idle.  The upper layer will soon
            start the interface anyway, and there are no significant
            delay.  */
-       fe_start(&sc->sc_if);
+       if_devstart(&sc->sc_if);
 #endif
 }
 
@@ -1727,7 +1729,7 @@ fe_intr (void *arg)
                 * interrupt when the transmission buffer is full.
                 */
                if ((sc->sc_if.if_flags & IFF_OACTIVE) == 0)
-                       fe_start(&sc->sc_if);
+                       if_devstart(&sc->sc_if);
        }
 
        kprintf("fe%d: too many loops\n", sc->sc_unit);
index a761869..7da8fa3 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.27 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.30 2008/01/06 16:55:50 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.31 2008/05/14 11:59:20 sephe Exp $
  */
 
 #include "opt_inet.h"
@@ -413,7 +413,7 @@ fwe_output_callback(struct fw_xfer *xfer)
 
        /* for queue full */
        if (!ifq_is_empty(&ifp->if_snd))
-               fwe_start(ifp);
+               if_devstart(ifp);
        lwkt_serialize_exit(ifp->if_serializer);
 }
 
index f9b9d87..5a5c90c 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.110.2.30 2003/06/12 16:47:05 mux Exp $
- * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.50 2007/09/15 21:28:15 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.51 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*
@@ -40,6 +40,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
 #include <sys/thread2.h>
@@ -689,6 +690,9 @@ fxp_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 
 failmem:
@@ -1049,9 +1053,13 @@ fxp_start(struct ifnet *ifp)
         * of the command chain).
         */
        if (sc->need_mcsetup) {
+               ifq_purge(&ifp->if_snd);
                return;
        }
 
+       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
+               return;
+
        txp = NULL;
 
        /*
@@ -1068,7 +1076,7 @@ fxp_start(struct ifnet *ifp)
                 * Grab a packet to transmit. The packet is dequeued,
                 * once we are sure that we have enough free descriptors.
                 */
-               mb_head = ifq_poll(&ifp->if_snd);
+               mb_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (mb_head == NULL)
                        break;
 
@@ -1101,20 +1109,22 @@ tbdinit:
                         * mbuf chain first. Bail out if we can't get the
                         * new buffers.
                         */
-                       if (ntries > 0)
+                       if (ntries > 0) {
+                               ifq_prepend(&ifp->if_snd, mb_head);
+                               ifp->if_flags |= IFF_OACTIVE;
                                break;
+                       }
+
                        mn = m_dup(mb_head, MB_DONTWAIT);
-                       if (mn == NULL)
+                       if (mn == NULL) {
+                               ifq_prepend(&ifp->if_snd, mb_head);
                                break;
-                        /* We can transmit the packet, dequeue it. */
-                       ifq_dequeue(&ifp->if_snd, mb_head);
+                       }
+
                        m_freem(mb_head);
                        mb_head = mn;
                        ntries = 1;
                        goto tbdinit;
-               } else {
-                       /* Nothing to worry about, just dequeue. */
-                       ifq_dequeue(&ifp->if_snd, mb_head);
                }
 
                txp->tbd_number = segment;
@@ -1156,6 +1166,9 @@ tbdinit:
                BPF_MTAP(ifp, mb_head);
        }
 
+       if (sc->tx_queued >= FXP_NTXCB - 1)
+               ifp->if_flags |= IFF_OACTIVE;
+
        /*
         * We're finished. If we added to the list, issue a RESUME to get DMA
         * going again if suspended.
@@ -1269,7 +1282,9 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
         */
        if (statack & (FXP_SCB_STATACK_CXTNO | FXP_SCB_STATACK_CNA)) {
                struct fxp_cb_tx *txp;
+               int old_queued;
 
+               old_queued = sc->tx_queued;
                for (txp = sc->cbl_first; sc->tx_queued &&
                    (txp->cb_status & FXP_CB_STATUS_C) != 0;
                    txp = txp->next) {
@@ -1282,16 +1297,21 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
                        }
                }
                sc->cbl_first = txp;
-               ifp->if_timer = 0;
+
+               ifp->if_timer = 0;      /* XXX only if tx_queued is 0 */
+               if (old_queued > sc->tx_queued)
+                       ifp->if_flags &= ~IFF_OACTIVE;
+
                if (sc->tx_queued == 0) {
                        if (sc->need_mcsetup)
                                fxp_mc_setup(sc);
                }
+
                /*
                 * Try to start more packets transmitting.
                 */
                if (!ifq_is_empty(&ifp->if_snd))
-                       (*ifp->if_start)(ifp);
+                       if_devstart(ifp);
        }
 
        /*
index 1ceba78..e027d91 100644 (file)
@@ -48,7 +48,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ie/if_ie.c,v 1.72.2.4 2003/03/27 21:01:49 mdodd Exp $
- * $DragonFly: src/sys/dev/netif/ie/if_ie.c,v 1.32 2007/07/11 23:46:58 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ie/if_ie.c,v 1.33 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*
@@ -1010,7 +1010,7 @@ ietint(int unit, struct ie_softc *ie)
        /* Wish I knew why this seems to be necessary... */
        ie->xmit_cmds[0]->ie_xmit_status |= IE_STAT_COMPL;
 
-       iestart(&ie->arpcom.ac_if);
+       if_devstart(&ie->arpcom.ac_if);
        return (0);             /* shouldn't be necessary */
 }
 
index 9c34460..44c1ae0 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/iwi/if_iwi.c,v 1.8.2.6 2006/02/23 02:06:46 sam Exp $
- * $DragonFly: src/sys/dev/netif/iwi/if_iwi.c,v 1.20 2008/05/10 07:11:28 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/iwi/if_iwi.c,v 1.21 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*-
@@ -43,6 +43,7 @@
 #include <sys/mbuf.h>
 #include <sys/kernel.h>
 #include <sys/kthread.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/systm.h>
 #include <sys/malloc.h>
@@ -538,6 +539,9 @@ iwi_attach(device_t dev)
                goto fail1;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
 
@@ -958,7 +962,7 @@ iwi_resume(device_t dev)
        if (ifp->if_flags & IFF_UP) {
                ifp->if_init(ifp->if_softc);
                if (ifp->if_flags & IFF_RUNNING)
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
        }
 
        lwkt_serialize_exit(ifp->if_serializer);
@@ -1538,7 +1542,7 @@ iwi_tx_intr(struct iwi_softc *sc, struct iwi_tx_ring *txq)
 
        sc->sc_tx_timer = 0;
        ifp->if_flags &= ~IFF_OACTIVE;
-       iwi_start(ifp);
+       if_devstart(ifp);
 }
 
 static void
@@ -1839,12 +1843,11 @@ iwi_start(struct ifnet *ifp)
        struct ieee80211_node *ni;
        int ac;
 
-       if (ic->ic_state != IEEE80211_S_RUN)
+       ieee80211_drain_mgtq(&ic->ic_mgtq);
+       if (ic->ic_state != IEEE80211_S_RUN) {
+               ifq_purge(&ifp->if_snd);
                return;
-
-       IF_POLL(&ic->ic_mgtq, m0);
-       if (m0 != NULL)
-               ieee80211_drain_mgtq(&ic->ic_mgtq);
+       }
 
        for (;;) {
                m0 = ifq_dequeue(&ifp->if_snd, NULL);
index 3c333c9..c1af330 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/iwl/iwl2100.c,v 1.3 2008/03/08 06:43:52 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/iwl/iwl2100.c,v 1.4 2008/05/14 11:59:20 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -39,6 +39,7 @@
 #include <sys/endian.h>
 #include <sys/firmware.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/mbuf.h>
 #include <sys/module.h>
 #include <sys/sysctl.h>
@@ -313,6 +314,9 @@ iwl2100_attach(device_t dev)
                return ENXIO;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        /*
         * Attach radio tap
         */
@@ -846,14 +850,19 @@ iwl2100_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if (sc->sc_flags & IWL2100_F_DETACH)
+       if (sc->sc_flags & IWL2100_F_DETACH) {
+               ieee80211_drain_mgtq(&ic->ic_mgtq);
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
-       if ((sc->sc_flags & IWL2100_F_IFSTART) == 0)
+       if ((sc->sc_flags & IWL2100_F_IFSTART) == 0) {
+               ifq_purge(&ifp->if_snd);
                goto back;
+       }
 
        while (tr->tr_used < IWL2100_TX_USED_MAX) {
                struct ieee80211_frame *wh;
@@ -987,7 +996,9 @@ iwl2100_newstate_dispatch(struct netmsg *nmsg)
        struct iwlmsg *msg = (struct iwlmsg *)nmsg;
        struct iwl2100_softc *sc = msg->iwlm_softc;
        struct ieee80211com *ic = &sc->sc_ic;
+#ifdef INVARIANTS
        struct ifnet *ifp = &ic->ic_if;
+#endif
        enum ieee80211_state nstate, ostate;
        int arg = msg->iwlm_arg, error = 0;
 
@@ -1738,7 +1749,9 @@ iwl2100_rxdesc_setup(struct iwl2100_softc *sc, int buf_idx)
 static int
 iwl2100_init_firmware(struct iwl2100_softc *sc)
 {
+#ifdef INVARIANTS
        struct ifnet *ifp = &sc->sc_ic.ic_if;
+#endif
        uint32_t intr;
        int i;
 
@@ -2496,7 +2509,7 @@ next:
                }
 
                ifp->if_flags &= ~IFF_OACTIVE;
-               ifp->if_start(ifp);
+               if_devstart(ifp);
        }
 }
 
@@ -2927,7 +2940,7 @@ iwl2100_rxeof_status(struct iwl2100_softc *sc, int i)
                                DPRINTF(sc, IWL2100_DBG_RESTART, "%s",
                                        "restart done\n");
                                sc->sc_flags |= IWL2100_F_IFSTART;
-                               ifp->if_start(ifp);
+                               if_devstart(ifp);
                        } else {
                                KKASSERT(ic->ic_opmode == IEEE80211_M_IBSS);
                                callout_reset(&sc->sc_ibss, (100 * hz) / 1000,
@@ -3577,7 +3590,7 @@ iwl2100_ibss_bssid(void *xsc)
                        IEEE80211_ADDR_COPY(ic->ic_bss->ni_bssid, bssid);
 
                        sc->sc_flags |= IWL2100_F_IFSTART;
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
                }
        }
 back:
index 6716648..bd665d5 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_kue.c,v 1.17.2.9 2003/04/13 02:39:25 murray Exp $
- * $DragonFly: src/sys/dev/netif/kue/if_kue.c,v 1.29 2008/01/06 16:55:50 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/kue/if_kue.c,v 1.30 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*
@@ -746,7 +746,7 @@ kue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 
        KUE_UNLOCK(sc);
 
@@ -805,18 +805,18 @@ kue_start(struct ifnet *ifp)
                return;
        }
 
-       m_head = ifq_poll(&ifp->if_snd);
+       m_head = ifq_dequeue(&ifp->if_snd, NULL);
        if (m_head == NULL) {
                KUE_UNLOCK(sc);
                return;
        }
 
        if (kue_encap(sc, m_head, 0)) {
+               /* kue_encap() will free m_head, if we reach here */
                ifp->if_flags |= IFF_OACTIVE;
                KUE_UNLOCK(sc);
                return;
        }
-       ifq_dequeue(&ifp->if_snd, m_head);
 
        /*
         * If there's a BPF listener, bounce a copy of this frame
@@ -989,8 +989,8 @@ kue_watchdog(struct ifnet *ifp)
        usbd_get_xfer_status(c->kue_xfer, NULL, NULL, NULL, &stat);
        kue_txeof(c->kue_xfer, c, stat);
 
-       if (ifq_is_empty(&ifp->if_snd))
-               kue_start(ifp);
+       if (!ifq_is_empty(&ifp->if_snd))
+               if_devstart(ifp);
        KUE_UNLOCK(sc);
 
        return;
index 74b3785..ae3cb79 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/if_le.c,v 1.56.2.4 2002/06/05 23:24:10 paul Exp $
- * $DragonFly: src/sys/dev/netif/le/if_le.c,v 1.37 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/le/if_le.c,v 1.38 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*
@@ -861,6 +861,8 @@ lemac_start(struct ifnet *ifp)
        }
 
        m = ifq_dequeue(&ifp->if_snd, NULL);
+       if (m == NULL)
+               break;
        LE_OUTB(sc, LEMAC_REG_MPN, tx_pg);      /* Shift 2K window. */
 
        /*
@@ -902,7 +904,7 @@ lemac_tne_intr(struct le_softc *sc)
            sc->le_if.if_collisions++;
     }
     sc->le_if.if_flags &= ~IFF_OACTIVE;
-    lemac_start(&sc->le_if);
+    if_devstart(&sc->le_if);
 }
 
 static void
@@ -1492,7 +1494,7 @@ lance_init(void *xsc)
        sc->le_if.if_flags |= IFF_RUNNING;
        LN_WRCSR(sc, LN_CSR0_START|LN_CSR0_INITDONE|LN_CSR0_ENABINTR);
        /* lance_dumpcsrs(sc, "lance_init: up"); */
-       lance_start(&sc->le_if);
+       if_devstart(&sc->le_if);
     } else {
        /* lance_dumpcsrs(sc, "lance_init: down"); */
        sc->le_if.if_flags &= ~IFF_RUNNING;
@@ -1536,7 +1538,7 @@ lance_intr(struct le_softc *sc)
 
     if (oldcsr & LN_CSR0_TXINT) {
        if (lance_tx_intr(sc))
-           lance_start(&sc->le_if);
+           if_devstart(&sc->le_if);
     }
 
     if (oldcsr == (LN_CSR0_PENDINTR|LN_CSR0_RXON|LN_CSR0_TXON))
@@ -1648,7 +1650,7 @@ lance_start(struct ifnet *ifp)
        return;
 
     for (;;) {
-       m = ifq_poll(&ifp->if_snd);
+       m = ifq_dequeue(&ifp->if_snd, NULL);
        if (m == NULL)
            break;
 
@@ -1672,6 +1674,7 @@ lance_start(struct ifnet *ifp)
            /*
             * Try to see if we can free up anything off the transit ring.
             */
+           ifq_prepend(&ifp->if_snd, m);
            if (lance_tx_intr(sc) > 0) {
                LN_STAT(tx_drains[0]++);
                continue;
@@ -1690,6 +1693,7 @@ lance_start(struct ifnet *ifp)
            slop += ri->ri_heapend - ri->ri_outptr;
            if (len + slop > ri->ri_outsize) {
                LN_STAT(tx_nospc[1]++);
+               ifq_prepend(&ifp->if_snd, m);
                break;
            }
            /*
@@ -1719,8 +1723,6 @@ lance_start(struct ifnet *ifp)
        if (m->m_pkthdr.len < len)
            LN_ZERO(sc, bp, len - m->m_pkthdr.len);
 
-       ifq_dequeue(&ifp->if_snd, m);
-
        /*
         * Finally, copy out the descriptor and tell the
         * LANCE to transmit!.
index e3e5922..adc3268 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lge/if_lge.c,v 1.5.2.2 2001/12/14 19:49:23 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.40 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.41 2008/05/14 11:59:20 sephe Exp $
  */
 
 /*
@@ -80,6 +80,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/serialize.h>
 #include <sys/thread2.h>
@@ -557,6 +558,9 @@ lge_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->lge_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -1008,7 +1012,7 @@ lge_tick_serialized(void *xsc)
                                kprintf("lge%d: gigabit link up\n",
                                    sc->lge_unit);
                        if (!ifq_is_empty(&ifp->if_snd))
-                               (*ifp->if_start)(ifp);
+                               if_devstart(ifp);
                }
        }
 
@@ -1059,7 +1063,7 @@ lge_intr(void *arg)
        CSR_WRITE_4(sc, LGE_IMR, LGE_IMR_SETRST_CTL0|LGE_IMR_INTR_ENB);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1085,6 +1089,9 @@ lge_encap(struct lge_softc *sc, struct mbuf *m_head, uint32_t *txidx)
 
        for (m = m_head; m != NULL; m = m->m_next) {
                if (m->m_len != 0) {
+                       if (frag == LGE_FRAG_CNT)
+                               break;
+
                        tot_len += m->m_len;
                        f = &cur_tx->lge_frags[frag];
                        f->lge_fraglen = m->m_len;
@@ -1093,9 +1100,8 @@ lge_encap(struct lge_softc *sc, struct mbuf *m_head, uint32_t *txidx)
                        frag++;
                }
        }
-
-       if (m != NULL)
-               return(ENOBUFS);
+       /* Caller should make sure that 'm_head' is not excessive fragmented */
+       KASSERT(m == NULL, ("too many fragments\n"));
 
        cur_tx->lge_mbuf = m_head;
        cur_tx->lge_ctl = LGE_TXCTL_WANTINTR|LGE_FRAGCNT(frag)|tot_len;
@@ -1118,12 +1124,14 @@ static void
 lge_start(struct ifnet *ifp)
 {
        struct lge_softc *sc = ifp->if_softc;
-       struct mbuf *m_head = NULL;
+       struct mbuf *m_head = NULL, *m_defragged;
        uint32_t idx;
        int need_timer;
 
-       if (!sc->lge_link)
+       if (!sc->lge_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        idx = sc->lge_cdata.lge_tx_prod;
 
@@ -1132,18 +1140,46 @@ lge_start(struct ifnet *ifp)
 
        need_timer = 0;
        while(sc->lge_ldata->lge_tx_list[idx].lge_mbuf == NULL) {
-               if (CSR_READ_1(sc, LGE_TXCMDFREE_8BIT) == 0)
+               struct mbuf *m;
+               int frags;
+
+               if (CSR_READ_1(sc, LGE_TXCMDFREE_8BIT) == 0) {
+                       ifp->if_flags |= IFF_OACTIVE;
                        break;
+               }
 
-               m_head = ifq_poll(&ifp->if_snd);
+               m_defragged = NULL;
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
-               if (lge_encap(sc, m_head, &idx)) {
-                       ifp->if_flags |= IFF_OACTIVE;
-                       break;
+again:
+               frags = 0;
+               for (m = m_head; m != NULL; m = m->m_next)
+                       ++frags;
+               if (frags > LGE_FRAG_CNT) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m_head);
+                               continue;
+                       }
+
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m_head);
+                               continue;
+                       }
+                       m_head = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
+
+               lge_encap(sc, m_head, &idx);
                need_timer = 1;
 
                BPF_MTAP(ifp, m_head);
@@ -1392,7 +1428,7 @@ lge_watchdog(struct ifnet *ifp)
        lge_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 }
 
 /*
index cf5ca40..f65cf19 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lge/if_lgereg.h,v 1.2.2.1 2001/06/19 19:42:38 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/lge/if_lgereg.h,v 1.10 2006/08/01 18:05:02 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/lge/if_lgereg.h,v 1.11 2008/05/14 11:59:20 sephe Exp $
  */
 
 
@@ -400,10 +400,12 @@ struct lge_frag {
        uint16_t                lge_rsvd1;
 };
 
+#define LGE_FRAG_CNT           10
+
 struct lge_tx_desc {
        /* Hardware descriptor section */
        uint32_t                lge_ctl;
-       struct lge_frag         lge_frags[10];
+       struct lge_frag         lge_frags[LGE_FRAG_CNT];
        uint32_t                lge_rsvd0;
        union {
                struct mbuf             *lge_mbuf;
index ffdc4a8..2d7fd3f 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: am7990.c,v 1.68 2005/12/11 12:21:25 christos Exp $     */
 /*     $FreeBSD: src/sys/dev/le/am7990.c,v 1.3 2006/05/16 21:04:01 marius Exp $        */
-/*     $DragonFly: src/sys/dev/netif/lnc/am7990.c,v 1.4 2007/03/24 08:29:57 sephe Exp $        */
+/*     $DragonFly: src/sys/dev/netif/lnc/am7990.c,v 1.5 2008/05/14 11:59:20 sephe Exp $        */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -479,8 +479,7 @@ am7990_intr(void *arg)
        (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               am7990_start_locked(sc);
-
+               if_devstart(ifp);
 }
 
 /*
@@ -505,7 +504,6 @@ am7990_start_locked(struct lance_softc *sc)
 
        for (; sc->sc_no_td < sc->sc_ntbuf &&
            !ifq_is_empty(&ifp->if_snd);) {
-               m = ifq_poll(&ifp->if_snd);
                rp = LE_TMDADDR(sc, bix);
                (*sc->sc_copyfromdesc)(sc, &tmd, rp, sizeof(tmd));
 
@@ -516,8 +514,8 @@ am7990_start_locked(struct lance_softc *sc)
                            sc->sc_no_td, sc->sc_last_td);
                }
 
-               ifq_dequeue(&ifp->if_snd, m);
-               if (m == 0)
+               m = ifq_dequeue(&ifp->if_snd, NULL);
+               if (m == NULL)
                        break;
 
                /*
index 085b021..5622707 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: am79900.c,v 1.17 2005/12/24 20:27:29 perry Exp $       */
 /*     $FreeBSD: src/sys/dev/le/am79900.c,v 1.3 2006/05/16 21:04:01 marius Exp $       */
-/*     $DragonFly: src/sys/dev/netif/lnc/am79900.c,v 1.4 2007/03/24 08:29:57 sephe Exp $       */
+/*     $DragonFly: src/sys/dev/netif/lnc/am79900.c,v 1.5 2008/05/14 11:59:20 sephe Exp $       */
 
 
 /*-
@@ -517,8 +517,7 @@ am79900_intr(void *arg)
        (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               am79900_start_locked(sc);
-
+               if_devstart(ifp);
 }
 
 /*
@@ -543,7 +542,6 @@ am79900_start_locked(struct lance_softc *sc)
 
        for (; sc->sc_no_td < sc->sc_ntbuf &&
            !ifq_is_empty(&ifp->if_snd);) {
-               m = ifq_poll(&ifp->if_snd);
                rp = LE_TMDADDR(sc, bix);
                (*sc->sc_copyfromdesc)(sc, &tmd, rp, sizeof(tmd));
 
@@ -554,8 +552,8 @@ am79900_start_locked(struct lance_softc *sc)
                            sc->sc_no_td, sc->sc_last_td);
                }
 
-               ifq_dequeue(&ifp->if_snd, m);
-               if (m == 0)
+               m = ifq_dequeue(&ifp->if_snd, NULL);
+               if (m == NULL)
                        break;
 
                /*
index 5fdc07f..8ec9a6d 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_le_isa.c,v 1.41 2005/12/24 20:27:41 perry Exp $     */
 /*     $FreeBSD: src/sys/dev/le/if_le_isa.c,v 1.1 2006/05/17 21:25:22 marius Exp $     */
-/*     $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.10 2006/10/25 20:55:57 dillon Exp $  */
+/*     $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.11 2008/05/14 11:59:20 sephe Exp $   */
 
 /*-
  * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -78,6 +78,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/lock.h>
 #include <sys/module.h>
 #include <sys/resource.h>
@@ -430,6 +431,9 @@ le_isa_attach(device_t dev)
                goto fail_am7990;
        }
 
+       sc->ifp->if_cpuid = ithread_cpuid(rman_get_start(lesc->sc_ires));
+       KKASSERT(sc->ifp->if_cpuid >= 0 && sc->ifp->if_cpuid < ncpus);
+
        return (0);
 
  fail_am7990:
index 32857c4..a7f1990 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_le_pci.c,v 1.43 2005/12/11 12:22:49 christos Exp $  */
 /*     $FreeBSD: src/sys/dev/le/if_le_pci.c,v 1.4 2006/06/05 15:14:14 marius Exp $     */
-/*     $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.11 2006/10/25 20:55:57 dillon Exp $  */
+/*     $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.12 2008/05/14 11:59:20 sephe Exp $   */
 
 
 /*-
@@ -79,6 +79,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/lock.h>
 #include <sys/module.h>
 #include <sys/resource.h>
@@ -443,6 +444,9 @@ le_pci_attach(device_t dev)
                goto fail_am79900;
        }
 
+       sc->ifp->if_cpuid = ithread_cpuid(rman_get_start(lesc->sc_ires));
+       KKASSERT(sc->ifp->if_cpuid >= 0 && sc->ifp->if_cpuid < ncpus);
+
        return (0);
 
  fail_am79900:
index a44d1c6..90350de 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: lance.c,v 1.34 2005/12/24 20:27:30 perry Exp $ */
 /*     $FreeBSD: src/sys/dev/le/lance.c,v 1.2 2006/05/16 21:04:01 marius Exp $ */
-/*     $DragonFly: src/sys/dev/netif/lnc/lance.c,v 1.6 2006/12/29 15:26:14 corecode Exp $      */
+/*     $DragonFly: src/sys/dev/netif/lnc/lance.c,v 1.7 2008/05/14 11:59:20 sephe Exp $ */
 
 
 /*-
@@ -299,7 +299,7 @@ lance_init_locked(struct lance_softc *sc)
                ifp->if_flags |= IFF_RUNNING;
                ifp->if_flags &= ~IFF_OACTIVE;
                ifp->if_timer = 0;
-               (*sc->sc_start_locked)(sc);
+               if_devstart(ifp);
        } else
                if_printf(ifp, "controller failed to initialize\n");
 
index de8beda..9a57fc2 100644 (file)
@@ -93,7 +93,7 @@
  */
 
 /* $FreeBSD: src/sys/dev/msk/if_msk.c,v 1.26 2007/12/05 09:41:58 remko Exp $ */
-/* $DragonFly: src/sys/dev/netif/msk/if_msk.c,v 1.3 2008/03/23 09:48:20 sephe Exp $ */
+/* $DragonFly: src/sys/dev/netif/msk/if_msk.c,v 1.4 2008/05/14 11:59:20 sephe Exp $ */
 
 /*
  * Device driver for the Marvell Yukon II Ethernet controller.
 #include <sys/kernel.h>
 #include <sys/bus.h>
 #include <sys/in_cksum.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/proc.h>
 #include <sys/rman.h>
@@ -1440,7 +1441,7 @@ static int
 mskc_attach(device_t dev)
 {
        struct msk_softc *sc;
-       int error, *port;
+       int error, *port, cpuid;
 
        sc = device_get_softc(dev);
        sc->msk_dev = dev;
@@ -1652,6 +1653,14 @@ mskc_attach(device_t dev)
                device_printf(dev, "couldn't set up interrupt handler\n");
                goto fail;
        }
+
+       cpuid = ithread_cpuid(rman_get_start(sc->msk_irq));
+       KKASSERT(cpuid >= 0 && cpuid < ncpus);
+
+       if (sc->msk_if[0] != NULL)
+               sc->msk_if[0]->msk_ifp->if_cpuid = cpuid;
+       if (sc->msk_if[1] != NULL)
+               sc->msk_if[1]->msk_ifp->if_cpuid = cpuid;
        return 0;
 fail:
        mskc_detach(dev);
@@ -2631,8 +2640,12 @@ msk_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
-           IFF_RUNNING || sc_if->msk_link == 0)
+       if (!sc_if->msk_link) {
+               ifq_purge(&ifp->if_snd);
+               return;
+       }
+
+       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return;
 
        for (enq = 0; !ifq_is_empty(&ifp->if_snd) &&
@@ -2704,7 +2717,7 @@ msk_watchdog(struct ifnet *ifp)
                        if_printf(ifp, "watchdog timeout (missed Tx interrupts) "
                            "-- recovering\n");
                        if (!ifq_is_empty(&ifp->if_snd))
-                               ifp->if_start(ifp);
+                               if_devstart(ifp);
                        return;
                }
        }
@@ -2713,7 +2726,7 @@ msk_watchdog(struct ifnet *ifp)
        ifp->if_oerrors++;
        msk_init(sc_if);
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 static int
@@ -3330,10 +3343,10 @@ mskc_intr(void *xsc)
 
        if (ifp0 != NULL && (ifp0->if_flags & IFF_RUNNING) != 0 &&
            !ifq_is_empty(&ifp0->if_snd))
-               ifp0->if_start(ifp0);
+               if_devstart(ifp0);
        if (ifp1 != NULL && (ifp1->if_flags & IFF_RUNNING) != 0 &&
            !ifq_is_empty(&ifp1->if_snd))
-               ifp1->if_start(ifp1);
+               if_devstart(ifp1);
 }
 
 static void
index a1879aa..cacd25c 100644 (file)
@@ -26,7 +26,7 @@
  * Written by: yen_cw@myson.com.tw  available at: http://www.myson.com.tw/
  *
  * $FreeBSD: src/sys/dev/my/if_my.c,v 1.2.2.4 2002/04/17 02:05:27 julian Exp $
- * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.29 2008/01/06 16:55:50 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.30 2008/05/14 11:59:21 sephe Exp $
  *
  * Myson fast ethernet PCI NIC driver
  *
@@ -38,6 +38,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/queue.h>
 #include <sys/bus.h>
@@ -539,7 +540,7 @@ my_autoneg_mii(struct my_softc * sc, int flag, int verbose)
        if (sc->my_tx_pend) {
                sc->my_autoneg = 0;
                sc->my_tx_pend = 0;
-               my_start(ifp);
+               if_devstart(ifp);
        }
 }
 
@@ -960,6 +961,9 @@ my_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->my_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 
 fail:
@@ -1261,7 +1265,7 @@ my_intr(void *arg)
        /* Re-enable interrupts. */
        CSR_WRITE_4(sc, MY_IMR, MY_INTRS);
        if (!ifq_is_empty(&ifp->if_snd))
-               my_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1334,6 +1338,7 @@ my_start(struct ifnet * ifp)
        crit_enter();
 
        if (sc->my_autoneg) {
+               ifq_purge(&ifp->if_snd);
                sc->my_tx_pend = 1;
                crit_exit();
                return;
@@ -1628,7 +1633,7 @@ my_watchdog(struct ifnet * ifp)
        my_reset(sc);
        my_init(sc);
        if (!ifq_is_empty(&ifp->if_snd))
-               my_start(ifp);
+               if_devstart(ifp);
        crit_exit();
 }
 
index 6bc953c..b3bb39b 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.65 2004/07/07 17:46:30 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.21 2007/08/14 13:30:35 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.22 2008/05/14 11:59:21 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -1065,7 +1065,7 @@ ndis_starttask(void *arg)
 
        ifp = arg;
        if (!ifq_is_empty(&ifp->if_snd))
-               ndis_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1099,16 +1099,16 @@ ndis_start(struct ifnet *ifp)
        p0 = &sc->ndis_txarray[sc->ndis_txidx];
 
        while(sc->ndis_txpending) {
-               m = ifq_poll(&ifp->if_snd);
+               m = ifq_dequeue(&ifp->if_snd, NULL);
                if (m == NULL)
                        break;
 
                sc->ndis_txarray[sc->ndis_txidx] = NULL;
 
                if (ndis_mtop(m, &sc->ndis_txarray[sc->ndis_txidx])) {
+                       m_freem(m);
                        return;
                }
-               ifq_dequeue(&ifp->if_snd, m);
 
                /*
                 * Save pointer to original mbuf
index 7ca3a86..a793402 100644 (file)
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_nfe.c,v 1.63 2006/06/17 18:00:43 brad Exp $        */
-/*     $DragonFly: src/sys/dev/netif/nfe/if_nfe.c,v 1.19 2008/03/10 12:59:51 sephe Exp $       */
+/*     $DragonFly: src/sys/dev/netif/nfe/if_nfe.c,v 1.20 2008/05/14 11:59:21 sephe Exp $       */
 
 /*
  * Copyright (c) 2006 The DragonFly Project.  All rights reserved.
@@ -61,6 +61,7 @@
 #include <sys/endian.h>
 #include <sys/kernel.h>
 #include <sys/bus.h>
+#include <sys/interrupt.h>
 #include <sys/proc.h>
 #include <sys/rman.h>
 #include <sys/serialize.h>
@@ -527,6 +528,9 @@ nfe_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 fail:
        nfe_detach(dev);
@@ -1018,7 +1022,7 @@ skip:
 
        if (data != NULL) {     /* at least one slot freed */
                ifp->if_flags &= ~IFF_OACTIVE;
-               ifp->if_start(ifp);
+               if_devstart(ifp);
        }
 }
 
@@ -1178,10 +1182,7 @@ nfe_start(struct ifnet *ifp)
        int count = 0;
        struct mbuf *m0;
 
-       if (ifp->if_flags & IFF_OACTIVE)
-               return;
-
-       if (ifq_is_empty(&ifp->if_snd))
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        for (;;) {
@@ -1393,7 +1394,7 @@ nfe_init(void *xsc)
         * so we are not going to get an interrupt, jump-start any pending
         * output.
         */
-       ifp->if_start(ifp);
+       if_devstart(ifp);
 }
 
 static void
index 8d51ca4..df0f62e 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/nge/if_nge.c,v 1.13.2.13 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.46 2008/03/10 12:59:51 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.47 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -96,6 +96,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/serialize.h>
 #include <sys/bus.h>
@@ -907,6 +908,9 @@ nge_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->nge_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 fail:
        nge_detach(dev);
@@ -1369,7 +1373,7 @@ nge_tick(void *xsc)
                                nge_miibus_statchg(sc->nge_miibus);
                                sc->nge_link++;
                                if (!ifq_is_empty(&ifp->if_snd))
-                                       nge_start(ifp);
+                                       if_devstart(ifp);
                        }
                }
        } else {
@@ -1385,7 +1389,7 @@ nge_tick(void *xsc)
                                        kprintf("nge%d: gigabit link up\n",
                                            sc->nge_unit);
                                if (!ifq_is_empty(&ifp->if_snd))
-                                       nge_start(ifp);
+                                       if_devstart(ifp);
                        }
                }
        }
@@ -1422,7 +1426,7 @@ nge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                nge_rxeof(sc);
                nge_txeof(sc);
                if (!ifq_is_empty(&ifp->if_snd))
-                       nge_start(ifp);
+                       if_devstart(ifp);
 
                if (sc->rxcycles > 0 || cmd == POLL_AND_CHECK_STATUS) {
                        uint32_t status;
@@ -1511,7 +1515,7 @@ nge_intr(void *arg)
        CSR_WRITE_4(sc, NGE_IER, 1);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               nge_start(ifp);
+               if_devstart(ifp);
 
        /* Data LED off for TBI mode */
 
@@ -1536,14 +1540,13 @@ nge_encap(struct nge_softc *sc, struct mbuf *m_head, uint32_t *txidx)
         * the fragment pointers. Stop when we run out
         * of fragments or hit the end of the mbuf chain.
         */
-       m = m_head;
        cur = frag = *txidx;
 
        for (m = m_head; m != NULL; m = m->m_next) {
                if (m->m_len != 0) {
                        if ((NGE_TX_LIST_CNT -
                            (sc->nge_cdata.nge_tx_cnt + cnt)) < 2)
-                               return(ENOBUFS);
+                               break;
                        f = &sc->nge_ldata->nge_tx_list[frag];
                        f->nge_ctl = NGE_CMDSTS_MORE | m->m_len;
                        f->nge_ptr = vtophys(mtod(m, vm_offset_t));
@@ -1554,9 +1557,8 @@ nge_encap(struct nge_softc *sc, struct mbuf *m_head, uint32_t *txidx)
                        cnt++;
                }
        }
-
-       if (m != NULL)
-               return(ENOBUFS);
+       /* Caller should make sure that 'm_head' is not excessive fragmented */
+       KASSERT(m == NULL, ("too many fragments\n"));
 
        sc->nge_ldata->nge_tx_list[*txidx].nge_extsts = 0;
        if (m_head->m_pkthdr.csum_flags) {
@@ -1596,29 +1598,59 @@ static void
 nge_start(struct ifnet *ifp)
 {
        struct nge_softc *sc = ifp->if_softc;
-       struct mbuf *m_head = NULL;
+       struct mbuf *m_head = NULL, *m_defragged;
        uint32_t idx;
        int need_trans;
 
-       if (!sc->nge_link)
+       if (!sc->nge_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        idx = sc->nge_cdata.nge_tx_prod;
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        need_trans = 0;
-       while(sc->nge_ldata->nge_tx_list[idx].nge_mbuf == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+       while (sc->nge_ldata->nge_tx_list[idx].nge_mbuf == NULL) {
+               struct mbuf *m;
+               int cnt;
+
+               m_defragged = NULL;
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
-               if (nge_encap(sc, m_head, &idx)) {
-                       ifp->if_flags |= IFF_OACTIVE;
-                       break;
+again:
+               cnt = 0;
+               for (m = m_head; m != NULL; m = m->m_next)
+                       ++cnt;
+               if ((NGE_TX_LIST_CNT -
+                   (sc->nge_cdata.nge_tx_cnt + cnt)) < 2) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m_head);
+                               ifp->if_flags |= IFF_OACTIVE;
+                               break;
+                       }
+
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m_head);
+                               continue;
+                       }
+                       m_head = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
+
+               nge_encap(sc, m_head, &idx);
                need_trans = 1;
 
                ETHER_BPF_MTAP(ifp, m_head);
@@ -2007,7 +2039,7 @@ nge_watchdog(struct ifnet *ifp)
        nge_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               nge_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 958d38a..2d1f82f 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_pcn.c,v 1.5.2.10 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.32 2006/12/22 23:26:21 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.33 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -62,6 +62,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/serialize.h>
 #include <sys/bus.h>
@@ -623,6 +624,9 @@ pcn_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->pcn_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return (0);
 fail:
        pcn_detach(dev);
@@ -890,7 +894,7 @@ pcn_tick(void *xsc)
                    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
                        sc->pcn_link++;
                        if (!ifq_is_empty(&ifp->if_snd))
-                               pcn_start(ifp);
+                               if_devstart(ifp);
        }
        callout_reset(&sc->pcn_stat_timer, hz, pcn_tick, sc);
 
@@ -931,9 +935,7 @@ pcn_intr(void *arg)
        }
 
        if (!ifq_is_empty(&ifp->if_snd))
-               pcn_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 /*
@@ -952,14 +954,13 @@ pcn_encap(struct pcn_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
         * the fragment pointers. Stop when we run out
         * of fragments or hit the end of the mbuf chain.
         */
-       m = m_head;
        cur = frag = *txidx;
 
        for (m = m_head; m != NULL; m = m->m_next) {
                if (m->m_len != 0) {
                        if ((PCN_TX_LIST_CNT -
                            (sc->pcn_cdata.pcn_tx_cnt + cnt)) < 2)
-                               return(ENOBUFS);
+                               break;
                        f = &sc->pcn_ldata->pcn_tx_list[frag];
                        f->pcn_txctl = (~(m->m_len) + 1) & PCN_TXCTL_BUFSZ;
                        f->pcn_txctl |= PCN_TXCTL_MBO;
@@ -973,9 +974,8 @@ pcn_encap(struct pcn_softc *sc, struct mbuf *m_head, u_int32_t *txidx)
                        cnt++;
                }
        }
-
-       if (m != NULL)
-               return(ENOBUFS);
+       /* Caller should make sure that 'm_head' is not excessive fragmented */
+       KASSERT(m == NULL, ("too many fragments\n"));
 
        sc->pcn_cdata.pcn_tx_chain[cur] = m_head;
        sc->pcn_ldata->pcn_tx_list[cur].pcn_txctl |=
@@ -997,31 +997,61 @@ static void
 pcn_start(struct ifnet *ifp)
 {
        struct pcn_softc        *sc;
-       struct mbuf             *m_head = NULL;
+       struct mbuf             *m_head = NULL, *m_defragged;
        u_int32_t               idx;
        int need_trans;
 
        sc = ifp->if_softc;
 
-       if (!sc->pcn_link)
+       if (!sc->pcn_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        idx = sc->pcn_cdata.pcn_tx_prod;
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        need_trans = 0;
-       while(sc->pcn_cdata.pcn_tx_chain[idx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+       while (sc->pcn_cdata.pcn_tx_chain[idx] == NULL) {
+               struct mbuf *m;
+               int cnt;
+
+               m_defragged = NULL;
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
-               if (pcn_encap(sc, m_head, &idx)) {
-                       ifp->if_flags |= IFF_OACTIVE;
-                       break;
+again:
+               cnt = 0;
+               for (m = m_head; m != NULL; m = m->m_next)
+                       ++cnt;
+               if ((PCN_TX_LIST_CNT -
+                   (sc->pcn_cdata.pcn_tx_cnt + cnt)) < 2) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m_head);
+                               ifp->if_flags |= IFF_OACTIVE;
+                               break;
+                       }
+
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m_head);
+                               continue;
+                       }
+                       m_head = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
+
+               pcn_encap(sc, m_head, &idx);
                need_trans = 1;
 
                BPF_MTAP(ifp, m_head);
@@ -1281,9 +1311,7 @@ pcn_watchdog(struct ifnet *ifp)
        pcn_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               pcn_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 /*
index 9afd32b..01204bb 100644 (file)
@@ -15,7 +15,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $FreeBSD: src/sys/dev/ral/rt2560.c,v 1.3 2006/03/21 21:15:43 damien Exp $
- * $DragonFly: src/sys/dev/netif/ral/rt2560.c,v 1.35 2008/02/08 09:42:29 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/ral/rt2560.c,v 1.36 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -27,6 +27,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/module.h>
@@ -402,6 +403,9 @@ rt2560_attach(device_t dev, int id)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
        return 0;
@@ -1133,7 +1137,7 @@ rt2560_tx_intr(struct rt2560_softc *sc)
                if ((sc->sc_flags &
                     (RT2560_FLAG_DATA_OACT | RT2560_FLAG_PRIO_OACT)) == 0)
                        ifp->if_flags &= ~IFF_OACTIVE;
-               rt2560_start(ifp);
+               ifp->if_start(ifp);
        }
 }
 
@@ -1206,7 +1210,7 @@ rt2560_prio_intr(struct rt2560_softc *sc)
                if ((sc->sc_flags &
                     (RT2560_FLAG_DATA_OACT | RT2560_FLAG_PRIO_OACT)) == 0)
                        ifp->if_flags &= ~IFF_OACTIVE;
-               rt2560_start(ifp);
+               ifp->if_start(ifp);
        }
 }
 
@@ -1966,19 +1970,20 @@ rt2560_start(struct ifnet *ifp)
 
                        if (rt2560_tx_mgt(sc, m0, ni) != 0)
                                break;
-
                } else {
-                       if (ic->ic_state != IEEE80211_S_RUN)
-                               break;
-                       m0 = ifq_poll(&ifp->if_snd);
-                       if (m0 == NULL)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
+
                        if (sc->txq.queued >= RT2560_TX_RING_COUNT - 1) {
                                ifp->if_flags |= IFF_OACTIVE;
                                sc->sc_flags |= RT2560_FLAG_DATA_OACT;
                                break;
                        }
-                       m0 = ifq_dequeue(&ifp->if_snd, m0);
+                       m0 = ifq_dequeue(&ifp->if_snd, NULL);
+                       if (m0 == NULL)
+                               break;
 
                        if (m0->m_len < sizeof (struct ether_header) &&
                            !(m0 = m_pullup(m0, sizeof (struct ether_header))))
index 56d618f..433c373 100644 (file)
@@ -15,7 +15,7 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $FreeBSD: src/sys/dev/ral/rt2661.c,v 1.4 2006/03/21 21:15:43 damien Exp $
- * $DragonFly: src/sys/dev/netif/ral/rt2661.c,v 1.29 2008/02/08 09:42:30 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/ral/rt2661.c,v 1.30 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -27,6 +27,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/module.h>
@@ -528,6 +529,9 @@ rt2661_attach(device_t dev, int id)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
        return 0;
@@ -1194,7 +1198,7 @@ rt2661_tx_dma_intr(struct rt2661_softc *sc, struct rt2661_tx_ring *txq)
 
                sc->sc_tx_timer = 0;
                ifp->if_flags &= ~IFF_OACTIVE;
-               rt2661_start(ifp);
+               ifp->if_start(ifp);
        }
 }
 
@@ -1925,8 +1929,10 @@ rt2661_start(struct ifnet *ifp)
                        if (rt2661_tx_mgt(sc, m0, ni) != 0)
                                break;
                } else {
-                       if (ic->ic_state != IEEE80211_S_RUN)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
 
                        m0 = ifq_dequeue(&ifp->if_snd, NULL);
                        if (m0 == NULL)
index 4f4f509..78c8979 100644 (file)
@@ -33,7 +33,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/re/if_re.c,v 1.25 2004/06/09 14:34:01 naddy Exp $
- * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.41 2008/04/27 15:10:37 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/re/if_re.c,v 1.42 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
-/* #include <sys/module.h> */
 #include <sys/rman.h>
 #include <sys/serialize.h>
 #include <sys/socket.h>
@@ -1286,6 +1286,9 @@ re_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->re_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
 fail:
        if (error)
                re_detach(dev);
@@ -1721,7 +1724,7 @@ re_tick_serialized(void *xsc)
                    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                        sc->re_link = 1;
                        if (!ifq_is_empty(&ifp->if_snd))
-                               ifp->if_start(ifp);
+                               if_devstart(ifp);
                }
        }
 
@@ -1750,7 +1753,7 @@ re_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                re_txeof(sc);
 
                if (!ifq_is_empty(&ifp->if_snd))
-                       (*ifp->if_start)(ifp);
+                       if_devstart(ifp);
 
                if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */
                        uint16_t       status;
@@ -1816,7 +1819,7 @@ re_intr(void *arg)
        }
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 }
 
 static int
@@ -1828,10 +1831,9 @@ re_encap(struct re_softc *sc, struct mbuf **m_head, int *idx, int *called_defrag
        bus_dmamap_t            map;
        int                     error;
 
-       *called_defrag = 0;
-       if (sc->re_ldata.re_tx_free <= 4)
-               return(EFBIG);
+       KASSERT(sc->re_ldata.re_tx_free > 4, ("not enough free TX desc\n"));
 
+       *called_defrag = 0;
        m = *m_head;
 
        /*
@@ -1977,16 +1979,27 @@ re_start(struct ifnet *ifp)
        struct mbuf *m_head2;
        int called_defrag, idx, need_trans;
 
-       if (!sc->re_link || (ifp->if_flags & IFF_OACTIVE))
+       if (!sc->re_link) {
+               ifq_purge(&ifp->if_snd);
+               return;
+       }
+
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        idx = sc->re_ldata.re_tx_prodidx;
 
        need_trans = 0;
        while (sc->re_ldata.re_tx_mbuf[idx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+               if (sc->re_ldata.re_tx_free <= 4) {
+                       ifp->if_flags |= IFF_OACTIVE;
+                       break;
+               }
+
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
+
                m_head2 = m_head;
                if (re_encap(sc, &m_head2, &idx, &called_defrag)) {
                        /*
@@ -1994,10 +2007,8 @@ re_start(struct ifnet *ifp)
                         * the returned m_head2 is garbage and we must dequeue
                         * and throw away the original packet.
                         */
-                       if (called_defrag) {
-                               ifq_dequeue(&ifp->if_snd, m_head);
+                       if (called_defrag)
                                m_freem(m_head);
-                       }
                        ifp->if_flags |= IFF_OACTIVE;
                        break;
                }
@@ -2008,7 +2019,6 @@ re_start(struct ifnet *ifp)
                 * and the original must be thrown away.  Otherwise m_head2
                 * *IS* the original.
                 */
-               ifq_dequeue(&ifp->if_snd, m_head);
                if (called_defrag)
                        m_freem(m_head);
                need_trans = 1;
@@ -2322,7 +2332,7 @@ re_watchdog(struct ifnet *ifp)
        re_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index ecafe26..c17afa8 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_rl.c,v 1.38.2.16 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.36 2007/06/26 07:47:28 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.37 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -99,6 +99,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -937,6 +938,9 @@ rl_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->rl_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -1245,7 +1249,7 @@ rl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                rl_rxeof(sc);
                rl_txeof(sc);
                if (!ifq_is_empty(&ifp->if_snd))
-                       rl_start(ifp);
+                       if_devstart(ifp);
 
                if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */
                        uint16_t status;
@@ -1313,7 +1317,7 @@ rl_intr(void *arg)
        }
 
        if (!ifq_is_empty(&ifp->if_snd))
-               rl_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1365,12 +1369,13 @@ rl_encap(struct rl_softc *sc, struct mbuf *m_head)
 static void
 rl_start(struct ifnet *ifp)
 {
-       struct rl_softc *sc;
+       struct rl_softc *sc = ifp->if_softc;
        struct mbuf *m_head = NULL;
 
-       sc = ifp->if_softc;
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
+               return;
 
-       while(RL_CUR_TXMBUF(sc) == NULL) {
+       while (RL_CUR_TXMBUF(sc) == NULL) {
                m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
index 0f14514..0c06dce 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  *
  * $NetBSD: rtw.c,v 1.72 2006/03/28 00:48:10 dyoung Exp $
- * $DragonFly: src/sys/dev/netif/rtw/rtw.c,v 1.12 2008/01/15 09:01:13 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/rtw/rtw.c,v 1.13 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -75,6 +75,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/rman.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
@@ -2954,17 +2955,20 @@ rtw_dequeue(struct ifnet *ifp, struct rtw_txsoft_blk **tsbp,
        *mp = NULL;
 
        if (sc->sc_ic.ic_state != IEEE80211_S_RUN) {
+               ifq_purge(&ifp->if_snd);
                DPRINTF(sc, RTW_DEBUG_XMIT,
                        ("%s: not running\n", ifp->if_xname));
                return 0;
        }
 
-       m0 = ifq_poll(&ifp->if_snd);
+       m0 = ifq_dequeue(&ifp->if_snd, NULL);
        if (m0 == NULL) {
                DPRINTF(sc, RTW_DEBUG_XMIT,
                        ("%s: no frame ready\n", ifp->if_xname));
                return 0;
        }
+       DPRINTF(sc, RTW_DEBUG_XMIT,
+               ("%s: dequeue data frame\n", ifp->if_xname));
 
        pri = ((m0->m_flags & M_PWR_SAV) != 0) ? RTW_TXPRIHI : RTW_TXPRIMD;
 
@@ -2972,14 +2976,11 @@ rtw_dequeue(struct ifnet *ifp, struct rtw_txsoft_blk **tsbp,
                DPRINTF(sc, RTW_DEBUG_XMIT_RSRC,
                        ("%s: no ring %d descriptor\n", ifp->if_xname, pri));
                *if_flagsp |= IFF_OACTIVE;
+               ifq_prepend(&ifp->if_snd, m0);
                sc->sc_if.if_timer = 1;
                return 0;
        }
 
-       ifq_dequeue(&ifp->if_snd, m0);
-       DPRINTF(sc, RTW_DEBUG_XMIT,
-               ("%s: dequeue data frame\n", ifp->if_xname));
-
        BPF_MTAP(ifp, m0);
 
        eh = mtod(m0, struct ether_header *);
@@ -3903,6 +3904,9 @@ rtw_attach(device_t dev)
                goto err;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        device_printf(dev, "hardware version %c\n", sc->sc_hwverid);
        if (bootverbose)
                ieee80211_announce(ic);
index dec7bf0..e731a60 100644 (file)
@@ -55,7 +55,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_rue.c,v 1.14 2004/06/09 14:34:03 naddy Exp $
- * $DragonFly: src/sys/dev/netif/rue/if_rue.c,v 1.12 2007/11/06 07:37:00 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/rue/if_rue.c,v 1.13 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -901,7 +901,7 @@ rue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 
        RUE_UNLOCK(sc);
 }
@@ -930,7 +930,7 @@ rue_tick(void *xsc)
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                sc->rue_link++;
                if (!ifq_is_empty(&ifp->if_snd))
-                       rue_start(ifp);
+                       if_devstart(ifp);
        }
 
        callout_reset(&sc->rue_stat_ch, hz, rue_tick, sc);
@@ -988,6 +988,7 @@ rue_start(struct ifnet *ifp)
        RUE_LOCK(sc);
 
        if (!sc->rue_link) {
+               ifq_purge(&ifp->if_snd);
                RUE_UNLOCK(sc);
                return;
        }
@@ -997,18 +998,18 @@ rue_start(struct ifnet *ifp)
                return;
        }
 
-       m_head = ifq_poll(&ifp->if_snd);
+       m_head = ifq_dequeue(&ifp->if_snd, NULL);
        if (m_head == NULL) {
                RUE_UNLOCK(sc);
                return;
        }
 
        if (rue_encap(sc, m_head, 0)) {
+               /* rue_encap() will free m_head, if we reach here */
                ifp->if_flags |= IFF_OACTIVE;
                RUE_UNLOCK(sc);
                return;
        }
-       ifq_dequeue(&ifp->if_snd, m_head);
 
        /*
         * If there's a BPF listener, bounce a copy of this frame
@@ -1252,7 +1253,7 @@ rue_watchdog(struct ifnet *ifp)
        rue_txeof(c->rue_xfer, c, stat);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               rue_start(ifp);
+               if_devstart(ifp);
 
        RUE_UNLOCK(sc);
 }
index ee6522f..abd8b22 100644 (file)
@@ -1,5 +1,5 @@
 /*     $OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $      */
-/*     $DragonFly: src/sys/dev/netif/rum/if_rum.c,v 1.27 2008/01/15 09:45:35 sephe Exp $       */
+/*     $DragonFly: src/sys/dev/netif/rum/if_rum.c,v 1.28 2008/05/14 11:59:21 sephe Exp $       */
 
 /*-
  * Copyright (c) 2005, 2006 Damien Bergamini <damien.bergamini@free.fr>
@@ -1125,8 +1125,10 @@ rum_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if (sc->sc_stopped)
+       if (sc->sc_stopped) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        crit_enter();
 
@@ -1158,17 +1160,19 @@ rum_start(struct ifnet *ifp)
                } else {
                        struct ether_header *eh;
 
-                       if (ic->ic_state != IEEE80211_S_RUN)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
 
-                       m0 = ifq_poll(&ifp->if_snd);
-                       if (m0 == NULL)
-                               break;
                        if (sc->tx_queued >= RT2573_TX_LIST_COUNT) {
                                ifp->if_flags |= IFF_OACTIVE;
                                break;
                        }
-                       ifq_dequeue(&ifp->if_snd, m0);
+
+                       m0 = ifq_dequeue(&ifp->if_snd, NULL);
+                       if (m0 == NULL)
+                               break;
 
                        if (m0->m_len < sizeof(struct ether_header)) {
                                m0 = m_pullup(m0, sizeof(struct ether_header));
index d6f55b7..862e9f0 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sbni/if_sbni.c,v 1.1.2.4 2002/08/11 09:32:00 fjoe Exp $
- * $DragonFly: src/sys/dev/netif/sbni/if_sbni.c,v 1.27 2008/03/10 08:36:30 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/sbni/if_sbni.c,v 1.28 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -278,7 +278,7 @@ sbni_init(void *xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        /* attempt to start output */
-       sbni_start(ifp);
+       if_devstart(ifp);
 }
 
 
index 9744673..7c869c5 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sbni/if_sbni_pci.c,v 1.6 2002/09/28 20:59:59 phk Exp $
- * $DragonFly: src/sys/dev/netif/sbni/if_sbni_pci.c,v 1.14 2006/12/22 23:26:21 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/sbni/if_sbni_pci.c,v 1.15 2008/05/14 11:59:21 sephe Exp $
  */
 
  
@@ -34,6 +34,7 @@
 #include <sys/socket.h>
 #include <sys/bus.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/module.h>
 #include <sys/rman.h>
 #include <sys/malloc.h>
@@ -139,12 +140,17 @@ sbni_pci_attach(device_t dev)
                sbni_attach(sc->slave_sc, next_sbni_unit++, flags);
 
        if (sc->irq_res) {
+               struct ifnet *ifp = &sc->arpcom.ac_if;
+
                error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
-                                      sbni_intr, sc, 
-                                      &sc->irq_handle, 
-                                      sc->arpcom.ac_if.if_serializer);
+                                      sbni_intr, sc, &sc->irq_handle,
+                                      ifp->if_serializer);
                if (error) {
                        kprintf("sbni%d: bus_setup_intr\n", next_sbni_unit);
+               } else {
+                       ifp->if_cpuid =
+                               ithread_cpuid(rman_get_start(sc->irq_res));
+                       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
                }
        } else {
                kprintf("\nsbni%d: cannot claim irq!\n", next_sbni_unit);
index f80c04b..e7ee68b 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/sbsh/if_sbsh.c,v 1.3.2.1 2003/04/15 18:15:07 fjoe Exp $
- * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.26 2008/03/10 08:39:53 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/sbsh/if_sbsh.c,v 1.27 2008/05/14 11:59:21 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -40,6 +40,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -274,6 +275,9 @@ sbsh_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
index 0866d58..2007f22 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sf.c,v 1.18.2.8 2001/12/16 15:46:07 luigi Exp $
- * $DragonFly: src/sys/dev/netif/sf/if_sf.c,v 1.31 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/sf/if_sf.c,v 1.32 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -86,6 +86,7 @@
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/socket.h>
 #include <sys/serialize.h>
 #include <sys/bus.h>
@@ -786,6 +787,9 @@ sf_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sf_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -1101,9 +1105,7 @@ sf_intr(void *arg)
        csr_write_4(sc, SF_IMR, SF_INTRS);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               sf_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static void
@@ -1217,9 +1219,7 @@ sf_encap(struct sf_softc *sc, struct sf_tx_bufdesc_type0 *c,
        struct sf_frag          *f = NULL;
        struct mbuf             *m;
 
-       m = m_head;
-
-       for (m = m_head, frag = 0; m != NULL; m = m->m_next) {
+       for (m = m_head; m != NULL; m = m->m_next) {
                if (m->m_len != 0) {
                        if (frag == SF_MAXFRAGS)
                                break;
@@ -1231,35 +1231,8 @@ sf_encap(struct sf_softc *sc, struct sf_tx_bufdesc_type0 *c,
                        frag++;
                }
        }
-
-       if (m != NULL) {
-               struct mbuf             *m_new = NULL;
-
-               MGETHDR(m_new, MB_DONTWAIT, MT_DATA);
-               if (m_new == NULL) {
-                       kprintf("sf%d: no memory for tx list", sc->sf_unit);
-                       return(1);
-               }
-
-               if (m_head->m_pkthdr.len > MHLEN) {
-                       MCLGET(m_new, MB_DONTWAIT);
-                       if (!(m_new->m_flags & M_EXT)) {
-                               m_freem(m_new);
-                               kprintf("sf%d: no memory for tx list",
-                                   sc->sf_unit);
-                               return(1);
-                       }
-               }
-               m_copydata(m_head, 0, m_head->m_pkthdr.len,
-                   mtod(m_new, caddr_t));
-               m_new->m_pkthdr.len = m_new->m_len = m_head->m_pkthdr.len;
-               m_freem(m_head);
-               m_head = m_new;
-               f = &c->sf_frags[0];
-               f->sf_fraglen = f->sf_pktlen = m_head->m_pkthdr.len;
-               f->sf_addr = vtophys(mtod(m_head, caddr_t));
-               frag = 1;
-       }
+       /* Caller should make sure that 'm_head' is not excessive fragmented */
+       KASSERT(m == NULL, ("too many fragments\n"));
 
        c->sf_mbuf = m_head;
        c->sf_id = SF_TX_BUFDESC_ID;
@@ -1276,15 +1249,17 @@ sf_start(struct ifnet *ifp)
 {
        struct sf_softc         *sc;
        struct sf_tx_bufdesc_type0 *cur_tx = NULL;
-       struct mbuf             *m_head = NULL;
-       int                     i, txprod;
+       struct mbuf             *m_head = NULL, *m_defragged;
+       int                     i, txprod, need_trans = 0;
 
        sc = ifp->if_softc;
 
-       if (!sc->sf_link)
+       if (!sc->sf_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        txprod = csr_read_4(sc, SF_TXDQ_PRODIDX);
@@ -1297,35 +1272,65 @@ sf_start(struct ifnet *ifp)
                i = SF_IDX_HI(txprod) >> 4;
        }
 
-       while(sc->sf_ldata->sf_tx_dlist[i].sf_mbuf == NULL) {
+       while (sc->sf_ldata->sf_tx_dlist[i].sf_mbuf == NULL) {
+               struct mbuf *m;
+               int frag;
+
+               /*
+                * Don't get the TX DMA queue get too full.
+                */
+               if (sc->sf_tx_cnt > 64) {
+                       ifp->if_flags |= IFF_OACTIVE;
+                       break;
+               }
+#ifdef foo
                if (sc->sf_tx_cnt >= (SF_TX_DLIST_CNT - 5)) {
                        ifp->if_flags |= IFF_OACTIVE;
-                       cur_tx = NULL;
                        break;
                }
-               m_head = ifq_poll(&ifp->if_snd);
+#endif
+
+               m_defragged = NULL;
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
-               cur_tx = &sc->sf_ldata->sf_tx_dlist[i];
-               if (sf_encap(sc, cur_tx, m_head)) {
-                       ifp->if_flags |= IFF_OACTIVE;
-                       cur_tx = NULL;
-                       break;
+again:
+               frag = 0;
+               for (m = m_head; m != NULL; m = m->m_next)
+                       ++frag;
+               if (frag > SF_MAXFRAGS) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m_head);
+                               continue;
+                       }
+
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m_head);
+                               continue;
+                       }
+                       m_head = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
+
+               cur_tx = &sc->sf_ldata->sf_tx_dlist[i];
+               sf_encap(sc, cur_tx, m_head);
                BPF_MTAP(ifp, cur_tx->sf_mbuf);
 
                SF_INC(i, SF_TX_DLIST_CNT);
                sc->sf_tx_cnt++;
-               /*
-                * Don't get the TX DMA queue get too full.
-                */
-               if (sc->sf_tx_cnt > 64)
-                       break;
+               need_trans = 1;
        }
 
-       if (cur_tx == NULL)
+       if (!need_trans)
                return;
 
        /* Transmit */
@@ -1334,8 +1339,6 @@ sf_start(struct ifnet *ifp)
            ((i << 20) & 0xFFFF0000));
 
        ifp->if_timer = 5;
-
-       return;
 }
 
 static void
@@ -1415,10 +1418,11 @@ sf_stats_update(void *xsc)
        if (!sc->sf_link) {
                mii_pollstat(mii);
                if (mii->mii_media_status & IFM_ACTIVE &&
-                   IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
+                   IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                        sc->sf_link++;
                        if (!ifq_is_empty(&ifp->if_snd))
-                               sf_start(ifp);
+                               if_devstart(ifp);
+               }
        }
 
        callout_reset(&sc->sf_stat_timer, hz, sf_stats_update, sc);
@@ -1441,9 +1445,7 @@ sf_watchdog(struct ifnet *ifp)
        sf_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               sf_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static void
index 778a30b..4537818 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sfreg.h,v 1.6.2.1 2001/08/16 20:35:04 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/sf/if_sfreg.h,v 1.5 2006/08/01 18:08:24 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/sf/if_sfreg.h,v 1.6 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -829,7 +829,7 @@ struct sf_tx_bufdesc_type0 {
        u_int8_t                sf_fragcnt;
        u_int8_t                sf_rsvd2;
        u_int16_t               sf_rsvd1;
-       struct sf_frag          sf_frags[14];
+       struct sf_frag          sf_frags[SF_MAXFRAGS];
 };
 
 /*
index 3386bda..21ce1b4 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_sis.c,v 1.13.4.24 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/sis/if_sis.c,v 1.36 2006/10/25 20:55:59 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/sis/if_sis.c,v 1.37 2008/05/14 11:59:21 sephe Exp $
  */
 
 /*
@@ -72,6 +72,7 @@
 #include <sys/thread2.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -1310,6 +1311,9 @@ sis_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sis_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
 fail:
        if (error)
                sis_detach(dev);
@@ -1635,7 +1639,7 @@ sis_tick(void *xsc)
                    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)
                        sc->sis_link++;
                if (!ifq_is_empty(&ifp->if_snd))
-                       sis_start(ifp);
+                       if_devstart(ifp);
        }
 
        callout_reset(&sc->sis_timer, hz, sis_tick, sc);
@@ -1670,7 +1674,7 @@ sis_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                sis_rxeof(sc);
                sis_txeof(sc);
                if (!ifq_is_empty(&ifp->if_snd))
-                       sis_start(ifp);
+                       if_devstart(ifp);
 
                if (sc->rxcycles > 0 || cmd == POLL_AND_CHECK_STATUS) {
                        uint32_t status;
@@ -1745,7 +1749,7 @@ sis_intr(void *arg)
        CSR_WRITE_4(sc, SIS_IER, 1);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               sis_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1759,25 +1763,18 @@ sis_encap(struct sis_softc *sc, struct mbuf *m_head, uint32_t *txidx)
        struct mbuf *m;
        int frag, cur, cnt = 0;
 
-       /*
-        * If there's no way we can send any packets, return now.
-        */
-       if (SIS_TX_LIST_CNT - sc->sis_cdata.sis_tx_cnt < 2)
-               return (ENOBUFS);
-
        /*
         * Start packing the mbufs in this chain into
         * the fragment pointers. Stop when we run out
         * of fragments or hit the end of the mbuf chain.
         */
-       m = m_head;
        cur = frag = *txidx;
 
        for (m = m_head; m != NULL; m = m->m_next) {
                if (m->m_len != 0) {
                        if ((SIS_TX_LIST_CNT -
                            (sc->sis_cdata.sis_tx_cnt + cnt)) < 2)
-                               return(ENOBUFS);
+                               break;
                        f = &sc->sis_ldata.sis_tx_list[frag];
                        f->sis_ctl = SIS_CMDSTS_MORE | m->m_len;
                        bus_dmamap_create(sc->sis_tag, 0, &f->sis_map);
@@ -1793,9 +1790,8 @@ sis_encap(struct sis_softc *sc, struct mbuf *m_head, uint32_t *txidx)
                        cnt++;
                }
        }
-
-       if (m != NULL)
-               return(ENOBUFS);
+       /* Caller should make sure that 'm_head' is not excessive fragmented */
+       KASSERT(m == NULL, ("too many fragments\n"));
 
        sc->sis_ldata.sis_tx_list[cur].sis_mbuf = m_head;
        sc->sis_ldata.sis_tx_list[cur].sis_ctl &= ~SIS_CMDSTS_MORE;
@@ -1817,31 +1813,69 @@ static void
 sis_start(struct ifnet *ifp)
 {
        struct sis_softc *sc;
-       struct mbuf *m_head = NULL;
+       struct mbuf *m_head = NULL, *m_defragged;
        uint32_t idx;
        int need_trans;
 
        sc = ifp->if_softc;
 
-       if (!sc->sis_link)
+       if (!sc->sis_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        idx = sc->sis_cdata.sis_tx_prod;
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        need_trans = 0;
-       while(sc->sis_ldata.sis_tx_list[idx].sis_mbuf == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
-               if (m_head == NULL)
-                       break;
+       while (sc->sis_ldata.sis_tx_list[idx].sis_mbuf == NULL) {
+               struct mbuf *m;
+               int cnt;
 
-               if (sis_encap(sc, m_head, &idx)) {
+               /*
+                * If there's no way we can send any packets, return now.
+                */
+               if (SIS_TX_LIST_CNT - sc->sis_cdata.sis_tx_cnt < 2) {
                        ifp->if_flags |= IFF_OACTIVE;
                        break;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
+
+               m_defragged = NULL;
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
+               if (m_head == NULL)
+                       break;
+
+again:
+               cnt = 0;
+               for (m = m_head; m != NULL; m = m->m_next)
+                       ++cnt;
+               if ((SIS_TX_LIST_CNT -
+                   (sc->sis_cdata.sis_tx_cnt + cnt)) < 2) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m_head);
+                               ifp->if_flags |= IFF_OACTIVE;
+                               break;
+                       }
+
+                       m_defragged = m_defrag(m_head, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m_head);
+                               continue;
+                       }
+                       m_head = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
+               }
+
+               sis_encap(sc, m_head, &idx);
                need_trans = 1;
 
                /*
@@ -2122,7 +2156,7 @@ sis_watchdog(struct ifnet *ifp)
        sis_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               sis_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 45d5254..f092091 100644 (file)
@@ -31,7 +31,7 @@
  *
  * $OpenBSD: if_sk.c,v 1.129 2006/10/16 12:30:08 tom Exp $
  * $FreeBSD: /c/ncvs/src/sys/pci/if_sk.c,v 1.20 2000/04/22 02:16:37 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.55 2008/03/16 15:50:22 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/sk/if_sk.c,v 1.56 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -91,6 +91,7 @@
 #include <sys/endian.h>
 #include <sys/in_cksum.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/mbuf.h>
 #include <sys/malloc.h>
 #include <sys/queue.h>
@@ -1322,7 +1323,7 @@ skc_attach(device_t dev)
        struct sk_softc *sc = device_get_softc(dev);
        uint8_t skrs;
        int *port;
-       int error;
+       int error, cpuid;
 
        DPRINTFN(2, ("begin skc_attach\n"));
 
@@ -1513,6 +1514,15 @@ skc_attach(device_t dev)
                device_printf(dev, "couldn't set up irq\n");
                goto fail;
        }
+
+       cpuid = ithread_cpuid(rman_get_start(sc->sk_irq));
+       KKASSERT(cpuid >= 0 && cpuid < ncpus);
+
+       if (sc->sk_if[0] != NULL)
+               sc->sk_if[0]->arpcom.ac_if.if_cpuid = cpuid;
+       if (sc->sk_if[1] != NULL)
+               sc->sk_if[1]->arpcom.ac_if.if_cpuid = cpuid;
+
        return 0;
 fail:
        skc_detach(dev);
@@ -1704,8 +1714,16 @@ sk_start(struct ifnet *ifp)
 
        DPRINTFN(2, ("sk_start\n"));
 
+       if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
+               return;
+
        while (sc_if->sk_cdata.sk_tx_mbuf[idx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+               if ((SK_TX_RING_CNT - sc_if->sk_cdata.sk_tx_cnt) <= 2) {
+                       ifp->if_flags |= IFF_OACTIVE;
+                       break;
+               }
+
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
@@ -1716,13 +1734,11 @@ sk_start(struct ifnet *ifp)
                 */
                if (sk_encap(sc_if, m_head, &idx)) {
                        ifp->if_flags |= IFF_OACTIVE;
+                       ifq_prepend(&ifp->if_snd, m_head);
                        break;
                }
 
-               /* now we are committed to transmit the packet */
-               ifq_dequeue(&ifp->if_snd, m_head);
                pkts++;
-
                BPF_MTAP(ifp, m_head);
        }
        if (pkts == 0)
@@ -2296,9 +2312,9 @@ sk_intr(void *xsc)
        CSR_WRITE_4(sc, SK_IMR, sc->sk_intrmask);
 
        if (ifp0 != NULL && !ifq_is_empty(&ifp0->if_snd))
-               sk_start(ifp0);
+               if_devstart(ifp0);
        if (ifp1 != NULL && !ifq_is_empty(&ifp1->if_snd))
-               sk_start(ifp1);
+               if_devstart(ifp1);
 }
 
 static void
index 040ce0a..a0c7dd2 100644 (file)
  * SUCH DAMAGE.
  * 
  * $FreeBSD-4.7: /usr/src/sys/pci/silan.c,v 1.0 2003/01/10 gaoyonghong $
- * $DragonFly: src/sys/dev/netif/sln/if_sln.c,v 1.1 2008/02/28 18:39:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/sln/if_sln.c,v 1.2 2008/05/14 11:59:22 sephe Exp $
  */
 
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/resource.h>
@@ -264,6 +265,10 @@ sln_attach(device_t dev)
                device_printf(dev, "couldn't set up irq\n");
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sln_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 fail:
        return error;
@@ -733,8 +738,12 @@ sln_tx(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if (!sc->connect ||
-           (ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
+       if (!sc->connect) {
+               ifq_purge(&ifp->if_snd);
+               return;
+       }
+
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        while (SL_CUR_TXBUF(sc) == NULL) {      /* SL_CUR_TXBUF(x) = x->sln_bufdata.sln_tx_buf[x->sln_bufdata.cur_tx] */
@@ -1084,7 +1093,7 @@ sln_interrupt(void *arg)
 
        /* Data in Tx buffer waiting for transimission */
        if (!ifq_is_empty(&ifp->if_snd))
-               sln_tx(ifp);
+               if_devstart(ifp);
 back:
        /* Re-enable interrupts. */
        SLN_WRITE_4(sc, SL_INT_MASK, SL_INRTS);
@@ -1147,7 +1156,7 @@ sln_watchdog(struct ifnet *ifp)
        sln_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               sln_tx(ifp);
+               if_devstart(ifp);
 }
 
 /* Stop all chip I/O */
index f0efbe4..6b57803 100644 (file)
@@ -29,7 +29,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  *   $FreeBSD: src/sys/dev/sn/if_sn.c,v 1.7.2.3 2001/02/04 04:38:38 toshi Exp $
- *   $DragonFly: src/sys/dev/netif/sn/if_sn.c,v 1.27 2006/12/22 23:26:22 swildner Exp $
+ *   $DragonFly: src/sys/dev/netif/sn/if_sn.c,v 1.28 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -85,6 +85,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/errno.h>
 #include <sys/sockio.h>
 #include <sys/malloc.h>
@@ -235,6 +236,9 @@ sn_attach(device_t dev)
                return error;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq_res));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 }
 
@@ -332,7 +336,7 @@ sninit(void *xsc)
        /*
         * Attempt to push out any waiting packets.
         */
-       snstart(ifp);
+       if_devstart(ifp);
 }
 
 
@@ -350,12 +354,14 @@ snstart(struct ifnet *ifp)
        u_char          packet_no;
        int             time_out;
 
-       if (ifp->if_flags & IFF_OACTIVE) {
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
-       }
+
        if (sc->pages_wanted != -1) {
+               /* XXX should never happen */
                kprintf("%s: snstart() while memory allocation pending\n",
                       ifp->if_xname);
+               ifp->if_flags |= IFF_OACTIVE;
                return;
        }
 startagain:
@@ -363,10 +369,10 @@ startagain:
        /*
         * Sneak a peek at the next packet
         */
-       m = ifq_poll(&ifp->if_snd);
-       if (m == 0) {
+       m = ifq_dequeue(&ifp->if_snd, NULL);
+       if (m == NULL)
                return;
-       }
+
        /*
         * Compute the frame length and set pad to give an overall even
         * number of bytes.  Below we assume that the packet length is even.
@@ -383,8 +389,7 @@ startagain:
        if (len + pad > ETHER_MAX_LEN - ETHER_CRC_LEN) {
                kprintf("%s: large packet discarded (A)\n", ifp->if_xname);
                ++sc->arpcom.ac_if.if_oerrors;
-               ifq_dequeue(&ifp->if_snd, m);
-               m_freem(m);
+               m_freem(top);
                goto readcheck;
        }
 #ifdef SW_PAD
@@ -443,6 +448,7 @@ startagain:
                ifp->if_timer = 1;
                ifp->if_flags |= IFF_OACTIVE;
                sc->pages_wanted = numPages;
+               ifq_prepend(&ifp->if_snd, top);
 
                return;
        }
@@ -452,6 +458,7 @@ startagain:
        packet_no = inb(BASE + ALLOC_RESULT_REG_B);
        if (packet_no & ARR_FAILED) {
                kprintf("%s: Memory allocation failed\n", ifp->if_xname);
+               ifq_prepend(&ifp->if_snd, top);
                goto startagain;
        }
        /*
@@ -472,16 +479,10 @@ startagain:
        outb(BASE + DATA_REG_B, (length + 6) & 0xFF);
        outb(BASE + DATA_REG_B, (length + 6) >> 8);
 
-       /*
-        * Get the packet from the kernel.  This will include the Ethernet
-        * frame header, MAC Addresses etc.
-        */
-       ifq_dequeue(&ifp->if_snd, m);
-
        /*
         * Push out the data to the card.
         */
-       for (top = m; m != 0; m = m->m_next) {
+       for (m = top; m != NULL; m = m->m_next) {
 
                /*
                 * Push out words.
@@ -574,11 +575,13 @@ snresume(struct ifnet *ifp)
        /*
         * Sneak a peek at the next packet
         */
-       m = ifq_poll(&ifp->if_snd);
+       m = ifq_dequeue(&ifp->if_snd, NULL);
        if (m == NULL) {
-               kprintf("%s: snresume() with nothing to send\n", ifp->if_xname);
+               kprintf("%s: snresume() with nothing to send\n",
+                       ifp->if_xname);
                return;
        }
+
        /*
         * Compute the frame length and set pad to give an overall even
         * number of bytes.  Below we assume that the packet length is even.
@@ -595,8 +598,7 @@ snresume(struct ifnet *ifp)
        if (len + pad > ETHER_MAX_LEN - ETHER_CRC_LEN) {
                kprintf("%s: large packet discarded (B)\n", ifp->if_xname);
                ++ifp->if_oerrors;
-               ifq_dequeue(&ifp->if_snd, m);
-               m_freem(m);
+               m_freem(top);
                return;
        }
 #ifdef SW_PAD
@@ -631,6 +633,7 @@ snresume(struct ifnet *ifp)
        if (packet_no & ARR_FAILED) {
                kprintf("%s: Memory allocation failed.  Weird.\n", ifp->if_xname);
                ifp->if_timer = 1;
+               ifq_prepend(&ifp->if_snd, top);
                goto try_start;
        }
        /*
@@ -652,6 +655,7 @@ snresume(struct ifnet *ifp)
                        ;
                outw(BASE + MMU_CMD_REG_W, MMUCR_FREEPKT);
 
+               ifq_prepend(&ifp->if_snd, top);
                return;
        }
        /*
@@ -667,16 +671,10 @@ snresume(struct ifnet *ifp)
        outb(BASE + DATA_REG_B, (length + 6) & 0xFF);
        outb(BASE + DATA_REG_B, (length + 6) >> 8);
 
-       /*
-        * Get the packet from the kernel.  This will include the Ethernet
-        * frame header, MAC Addresses etc.
-        */
-       ifq_dequeue(&ifp->if_snd, m);
-
        /*
         * Push out the data to the card.
         */
-       for (top = m; m != 0; m = m->m_next) {
+       for (m = top; m != NULL; m = m->m_next) {
 
                /*
                 * Push out words.
@@ -727,7 +725,7 @@ try_start:
         * Now pass control to snstart() to queue any additional packets
         */
        ifp->if_flags &= ~IFF_OACTIVE;
-       snstart(ifp);
+       if_devstart(ifp);
 
        /*
         * We've sent something, so we're active.  Set a watchdog in case the
@@ -891,7 +889,7 @@ sn_intr(void *arg)
                 * Attempt to queue more transmits.
                 */
                sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
-               snstart(&sc->arpcom.ac_if);
+               if_devstart(&sc->arpcom.ac_if);
        }
        /*
         * Transmit underrun.  We use this opportunity to update transmit
@@ -929,7 +927,7 @@ sn_intr(void *arg)
                 * Attempt to enqueue some more stuff.
                 */
                sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
-               snstart(&sc->arpcom.ac_if);
+               if_devstart(&sc->arpcom.ac_if);
        }
        /*
         * Some other error.  Try to fix it by resetting the adapter.
index dfe22f2..078fb5e 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_ste.c,v 1.14.2.9 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/ste/if_ste.c,v 1.36 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/ste/if_ste.c,v 1.37 2008/05/14 11:59:22 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -44,6 +44,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -621,9 +622,7 @@ ste_intr(void *xsc)
        CSR_WRITE_2(sc, STE_IMR, STE_INTRS);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ste_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 /*
@@ -805,7 +804,7 @@ ste_stats_update(void *xsc)
                         */
                        ste_miibus_statchg(sc->ste_dev);
                        if (!ifq_is_empty(&ifp->if_snd))
-                               ste_start(ifp);
+                               if_devstart(ifp);
                }
        }
 
@@ -978,6 +977,9 @@ ste_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->ste_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 
 fail:
@@ -1415,10 +1417,12 @@ ste_start(struct ifnet *ifp)
 
        sc = ifp->if_softc;
 
-       if (!sc->ste_link)
+       if (!sc->ste_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        idx = sc->ste_cdata.ste_tx_prod;
@@ -1471,8 +1475,6 @@ ste_start(struct ifnet *ifp)
                ifp->if_timer = 5;
                sc->ste_cdata.ste_tx_prod = idx;
        }
-
-       return;
 }
 
 static void
@@ -1492,9 +1494,7 @@ ste_watchdog(struct ifnet *ifp)
        ste_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ste_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static void
index 7ece21f..e788306 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_stge.c,v 1.32 2005/12/11 12:22:49 christos Exp $    */
 /*     $FreeBSD: src/sys/dev/stge/if_stge.c,v 1.2 2006/08/12 01:21:36 yongari Exp $    */
-/*     $DragonFly: src/sys/dev/netif/stge/if_stge.c,v 1.4 2008/03/10 12:59:52 sephe Exp $      */
+/*     $DragonFly: src/sys/dev/netif/stge/if_stge.c,v 1.5 2008/05/14 11:59:22 sephe Exp $      */
 
 /*-
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -49,6 +49,7 @@
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kernel.h>
+#include <sys/interrupt.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/module.h>
@@ -806,6 +807,9 @@ stge_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
 fail:
        if (error != 0)
                stge_detach(dev);
@@ -1324,9 +1328,10 @@ stge_start(struct ifnet *ifp)
                 * for the NIC to drain the ring.
                 */
                if (stge_encap(sc, &m_head)) {
-                       if (m_head == NULL)
-                               break;
-                       ifp->if_flags |= IFF_OACTIVE;
+                       if (m_head != NULL) {
+                               m_freem(m_head);
+                               ifp->if_flags |= IFF_OACTIVE;
+                       }
                        break;
                }
 
@@ -1568,7 +1573,7 @@ force_init:
 
        /* Try to get more packets going. */
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1855,7 +1860,7 @@ stge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                }
 
                if (!ifq_is_empty(&ifp->if_snd))
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
        }
 }
 #endif /* DEVICE_POLLING */
index 0c5e740..5d46cc8 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_ti.c,v 1.25.2.14 2002/02/15 04:20:20 silby Exp $
- * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.50 2008/03/10 12:59:52 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/ti/if_ti.c,v 1.51 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -91,6 +91,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -1571,8 +1572,11 @@ ti_attach(device_t dev)
                ether_ifdetach(ifp);
                goto fail;
        }
-       return 0;
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->ti_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
+       return 0;
 fail:
        ti_detach(dev);
        return(error);
@@ -1793,7 +1797,7 @@ ti_intr(void *xsc)
        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
 
        if ((ifp->if_flags & IFF_RUNNING) && !ifq_is_empty(&ifp->if_snd))
-               ti_start(ifp);
+               if_devstart(ifp);
 }
 
 static void
@@ -1916,7 +1920,7 @@ ti_start(struct ifnet *ifp)
 
        need_trans = 0;
        while(sc->ti_cdata.ti_tx_chain[prodidx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
@@ -1933,6 +1937,7 @@ ti_start(struct ifnet *ifp)
                        if ((TI_TX_RING_CNT - sc->ti_txcnt) <
                            m_head->m_pkthdr.csum_data + 16) {
                                ifp->if_flags |= IFF_OACTIVE;
+                               ifq_prepend(&ifp->if_snd, m_head);
                                break;
                        }
                }
@@ -1944,9 +1949,9 @@ ti_start(struct ifnet *ifp)
                 */
                if (ti_encap(sc, m_head, &prodidx)) {
                        ifp->if_flags |= IFF_OACTIVE;
+                       ifq_prepend(&ifp->if_snd, m_head);
                        break;
                }
-               ifq_dequeue(&ifp->if_snd, m_head);
                need_trans = 1;
 
                ETHER_BPF_MTAP(ifp, m_head);
@@ -2249,7 +2254,7 @@ ti_watchdog(struct ifnet *ifp)
        ifp->if_oerrors++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index d12ecb0..afe4cb1 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_tl.c,v 1.51.2.5 2001/12/16 15:46:08 luigi Exp $
- * $DragonFly: src/sys/dev/netif/tl/if_tl.c,v 1.38 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/tl/if_tl.c,v 1.39 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -1247,6 +1248,9 @@ tl_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->tl_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -1665,9 +1669,7 @@ tl_intr(void *xsc)
        }
 
        if (!ifq_is_empty(&ifp->if_snd))
-               tl_start(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static 
index 386dc5f..8b05daf 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/tx/if_tx.c,v 1.61.2.1 2002/10/29 01:43:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/tx/if_tx.c,v 1.41 2007/05/17 08:19:02 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/tx/if_tx.c,v 1.42 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -51,6 +51,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -280,6 +281,9 @@ epic_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -681,7 +685,7 @@ epic_intr(void *arg)
        if (status & (INTSTAT_TXC|INTSTAT_TCC|INTSTAT_TQE)) {
            epic_tx_done(sc);
            if (!ifq_is_empty(&sc->sc_if.if_snd))
-                   epic_ifstart(&sc->sc_if);
+               if_devstart(&sc->sc_if);
        }
 
        /* Check for rare errors */
@@ -783,7 +787,7 @@ epic_ifwatchdog(struct ifnet *ifp)
 
        /* Start output */
        if (!ifq_is_empty(&ifp->if_snd))
-               epic_ifstart(ifp);
+               if_devstart(ifp);
 }
 
 /*
index f5a6b4b..edb5073 100644 (file)
@@ -1,6 +1,6 @@
 /*     $OpenBSD: if_txp.c,v 1.48 2001/06/27 06:34:50 kjc Exp $ */
 /*     $FreeBSD: src/sys/dev/txp/if_txp.c,v 1.4.2.4 2001/12/14 19:50:43 jlemon Exp $ */
-/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.47 2008/03/10 12:59:52 sephe Exp $ */
+/*     $DragonFly: src/sys/dev/netif/txp/if_txp.c,v 1.48 2008/05/14 11:59:22 sephe Exp $ */
 
 /*
  * Copyright (c) 2001
@@ -51,6 +51,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -320,6 +321,9 @@ txp_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->sc_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -642,9 +646,7 @@ txp_intr(void *vsc)
        /* unmask all interrupts */
        WRITE_REG(sc, TXP_IMR, TXP_INT_A2H_3);
 
-       txp_start(&sc->sc_arpcom.ac_if);
-
-       return;
+       if_devstart(&sc->sc_arpcom.ac_if);
 }
 
 static void
@@ -722,12 +724,10 @@ txp_rx_reclaim(struct txp_softc *sc, struct txp_rx_ring *r)
                        m->m_pkthdr.csum_data = 0xffff;
                }
 
-               lwkt_serialize_enter(ifp->if_serializer);
                if (rxd->rx_stat & RX_STAT_VLAN)
                        VLAN_INPUT_TAG(m, htons(rxd->rx_vlan >> 16));
                else
                        ifp->if_input(ifp, m);
-               lwkt_serialize_exit(ifp->if_serializer);
 
 next:
 
@@ -1190,7 +1190,7 @@ txp_start(struct ifnet *ifp)
        struct txp_tx_ring *r = &sc->sc_txhir;
        struct txp_tx_desc *txd;
        struct txp_frag_desc *fxd;
-       struct mbuf *m, *m0;
+       struct mbuf *m, *m0, *m_defragged;
        struct txp_swdesc *sd;
        u_int32_t firstprod, firstcnt, prod, cnt;
 
@@ -1201,21 +1201,48 @@ txp_start(struct ifnet *ifp)
        cnt = r->r_cnt;
 
        while (1) {
-               m = ifq_poll(&ifp->if_snd);
-               if (m == NULL)
-                       break;
+               int frag;
 
                firstprod = prod;
                firstcnt = cnt;
 
-               sd = sc->sc_txd + prod;
-               sd->sd_mbuf = m;
-
                if ((TX_ENTRIES - cnt) < 4)
                        goto oactive;
 
-               txd = r->r_desc + prod;
+               m_defragged = NULL;
+               m = ifq_dequeue(&ifp->if_snd, NULL);
+               if (m == NULL)
+                       break;
+again:
+               frag = 1;       /* Extra desc */
+               for (m0 = m; m0 != NULL; m0 = m0->m_next)
+                       ++frag;
+               if ((cnt + frag) >= (TX_ENTRIES - 4)) {
+                       if (m_defragged != NULL) {
+                               /*
+                                * Even after defragmentation, there
+                                * are still too many fragments, so
+                                * drop this packet.
+                                */
+                               m_freem(m);
+                               goto oactive;
+                       }
 
+                       m_defragged = m_defrag(m, MB_DONTWAIT);
+                       if (m_defragged == NULL) {
+                               m_freem(m);
+                               continue;
+                       }
+                       m = m_defragged;
+
+                       /* Recount # of fragments */
+                       goto again;
+               }
+
+               sd = sc->sc_txd + prod;
+               sd->sd_mbuf = m;
+
+               txd = r->r_desc + prod;
                txd->tx_flags = TX_FLAGS_TYPE_DATA;
                txd->tx_numdesc = 0;
                txd->tx_addrlo = 0;
@@ -1226,8 +1253,8 @@ txp_start(struct ifnet *ifp)
                if (++prod == TX_ENTRIES)
                        prod = 0;
 
-               if (++cnt >= (TX_ENTRIES - 4))
-                       goto oactive;
+               ++cnt;
+               KASSERT(cnt < (TX_ENTRIES - 4), ("too many frag\n"));
 
                if (m->m_flags & M_VLANTAG) {
                        txd->tx_pflags = TX_PFLAGS_VLAN |
@@ -1249,8 +1276,9 @@ txp_start(struct ifnet *ifp)
                for (m0 = m; m0 != NULL; m0 = m0->m_next) {
                        if (m0->m_len == 0)
                                continue;
-                       if (++cnt >= (TX_ENTRIES - 4))
-                               goto oactive;
+
+                       ++cnt;
+                       KASSERT(cnt < (TX_ENTRIES - 4), ("too many frag\n"));
 
                        txd->tx_numdesc++;
 
@@ -1266,12 +1294,10 @@ txp_start(struct ifnet *ifp)
                                prod = 0;
                        } else
                                fxd++;
-
                }
 
                ifp->if_timer = 5;
 
-               ifq_dequeue(&ifp->if_snd, m);
                ETHER_BPF_MTAP(ifp, m);
                WRITE_REG(sc, r->r_reg, TXP_IDX2OFFSET(prod));
        }
index d437d2b..f2e9d7e 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/dev/usb/if_ural.c,v 1.10.2.8 2006/07/08 07:48:43 maxim Exp $  */
-/*     $DragonFly: src/sys/dev/netif/ural/if_ural.c,v 1.25 2008/01/15 09:01:13 sephe Exp $     */
+/*     $DragonFly: src/sys/dev/netif/ural/if_ural.c,v 1.26 2008/05/14 11:59:22 sephe Exp $     */
 
 /*-
  * Copyright (c) 2005, 2006
@@ -1369,8 +1369,10 @@ ural_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if (sc->sc_stopped)
+       if (sc->sc_stopped) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        crit_enter();
 
@@ -1403,17 +1405,19 @@ ural_start(struct ifnet *ifp)
                } else {
                        struct ether_header *eh;
 
-                       if (ic->ic_state != IEEE80211_S_RUN)
-                               break;
-                       m0 = ifq_poll(&ifp->if_snd);
-                       if (m0 == NULL)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
+
                        if (sc->tx_queued >= RAL_TX_LIST_COUNT) {
                                ifp->if_flags |= IFF_OACTIVE;
                                break;
                        }
 
-                       ifq_dequeue(&ifp->if_snd, m0);
+                       m0 = ifq_dequeue(&ifp->if_snd, NULL);
+                       if (m0 == NULL)
+                               break;
 
                        if (m0->m_len < sizeof (struct ether_header)) {
                                m0 = m_pullup(m0, sizeof (struct ether_header));
index 7420468..8662788 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/vge/if_vge.c,v 1.24 2006/02/14 12:44:56 glebius Exp $
- * $DragonFly: src/sys/dev/netif/vge/if_vge.c,v 1.7 2008/03/10 12:59:52 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/vge/if_vge.c,v 1.8 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -95,6 +95,7 @@
 #include <sys/proc.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -1033,6 +1034,9 @@ vge_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->vge_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 fail:
        vge_detach(dev);
@@ -1470,7 +1474,7 @@ vge_tick(struct vge_softc *sc)
                    IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                        sc->vge_link = 1;
                        if (!ifq_is_empty(&ifp->if_snd))
-                               ifp->if_start(ifp);
+                               if_devstart(ifp);
                }
        }
 }
@@ -1496,7 +1500,7 @@ vge_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                vge_txeof(sc);
 
                if (!ifq_is_empty(&ifp->if_snd))
-                       ifp->if_start(ifp);
+                       if_devstart(ifp);
 
                /* XXX copy & paste from vge_intr */
                if (cmd == POLL_AND_CHECK_STATUS) {
@@ -1574,7 +1578,7 @@ vge_intr(void *arg)
        CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               ifp->if_start(ifp);
+               if_devstart(ifp);
 }
 
 static int
@@ -1667,10 +1671,12 @@ vge_start(struct ifnet *ifp)
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       if (!sc->vge_link || (ifp->if_flags & IFF_OACTIVE))
+       if (!sc->vge_link) {
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
-       if (ifq_is_empty(&ifp->if_snd))
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        idx = sc->vge_ldata.vge_tx_prodidx;
@@ -1680,16 +1686,14 @@ vge_start(struct ifnet *ifp)
                pidx = VGE_TX_DESC_CNT - 1;
 
        while (sc->vge_ldata.vge_tx_mbuf[idx] == NULL) {
-               m_head = ifq_poll(&ifp->if_snd);
-               if (m_head == NULL)
-                       break;
-
                if (sc->vge_ldata.vge_tx_free <= 2) {
                        ifp->if_flags |= IFF_OACTIVE;
                        break;
                }
 
-               m_head = ifq_dequeue(&ifp->if_snd, m_head);
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
+               if (m_head == NULL)
+                       break;
 
                if (vge_encap(sc, m_head, idx)) {
                        /* If vge_encap() failed, it will free m_head for us */
index fdc2b08..625f1be 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_vr.c,v 1.26.2.13 2003/02/06 04:46:20 silby Exp $
- * $DragonFly: src/sys/dev/netif/vr/if_vr.c,v 1.46 2007/09/09 06:21:23 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/vr/if_vr.c,v 1.47 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -73,6 +73,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -791,12 +792,15 @@ vr_attach(device_t dev)
        error = bus_setup_intr(dev, sc->vr_irq, INTR_NETSAFE,
                               vr_intr, sc, &sc->vr_intrhand, 
                               ifp->if_serializer);
-
        if (error) {
                device_printf(dev, "couldn't set up irq\n");
                ether_ifdetach(ifp);
                goto fail;
        }
+
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->vr_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 
 fail:
@@ -1250,7 +1254,7 @@ vr_intr(void *arg)
                CSR_WRITE_2(sc, VR_IMR, VR_INTRS);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               vr_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
@@ -1317,7 +1321,7 @@ vr_start(struct ifnet *ifp)
        struct vr_chain *tx_chain;
        int cur_tx_idx, start_tx_idx, prev_tx_idx;
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        sc = ifp->if_softc;
@@ -1333,11 +1337,11 @@ vr_start(struct ifnet *ifp)
                return;
        }
 
-       while(tx_chain[cd->vr_tx_free_idx].vr_buf == NULL) {
+       while (tx_chain[cd->vr_tx_free_idx].vr_buf == NULL) {
                struct mbuf *m_head;
                struct vr_chain *cur_tx;
 
-               m_head = ifq_poll(&ifp->if_snd);
+               m_head = ifq_dequeue(&ifp->if_snd, NULL);
                if (m_head == NULL)
                        break;
 
@@ -1352,8 +1356,6 @@ vr_start(struct ifnet *ifp)
                        break;
                }
 
-               ifq_dequeue(&ifp->if_snd, m_head);
-
                /* XXX */
                if (cur_tx_idx != start_tx_idx)
                        VR_TXOWN(cur_tx) = VR_TXSTAT_OWN;
@@ -1583,7 +1585,7 @@ vr_watchdog(struct ifnet *ifp)
        vr_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               vr_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 16e367a..3d9d790 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/vx/if_vx.c,v 1.25.2.6 2002/02/13 00:43:10 dillon Exp $
- * $DragonFly: src/sys/dev/netif/vx/if_vx.c,v 1.28 2006/12/22 23:26:22 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/vx/if_vx.c,v 1.29 2008/05/14 11:59:22 sephe Exp $
  *
  */
 
@@ -229,7 +229,7 @@ vxinit(void *xsc)
     ifp->if_flags &= ~IFF_OACTIVE;
 
     /* Attempt to start output, if any. */
-    vxstart(ifp);
+    if_devstart(ifp);
 }
 
 static void
@@ -394,14 +394,15 @@ vxstart(struct ifnet *ifp)
 
 startagain:
     /* Sneak a peek at the next packet */
-    m0 = ifq_poll(&ifp->if_snd);
+    m0 = ifq_dequeue(&ifp->if_snd, NULL);
     if (m0 == NULL)
        return;
+
     /* We need to use m->m_pkthdr.len, so require the header */
-     M_ASSERTPKTHDR(m0);
-     len = m0->m_pkthdr.len;
+    M_ASSERTPKTHDR(m0);
+    len = m0->m_pkthdr.len;
 
-     pad = (4 - len) & 3;
+    pad = (4 - len) & 3;
 
     /*
      * The 3c509 automatically pads short packets to minimum ethernet length,
@@ -411,7 +412,6 @@ startagain:
     if (len + pad > ETHER_MAX_LEN) {
        /* packet is obviously too large: toss it */
        ++ifp->if_oerrors;
-       ifq_dequeue(&ifp->if_snd, m0);
        m_freem(m0);
        goto readcheck;
     }
@@ -422,11 +422,11 @@ startagain:
        if (CSR_READ_2(sc, VX_W1_FREE_TX) < len + pad + 4) { /* make sure */
            ifp->if_flags |= IFF_OACTIVE;
            ifp->if_timer = 1;
+           ifq_prepend(&ifp->if_snd, m0);
            return;
        }
     }
     CSR_WRITE_2(sc, VX_COMMAND, SET_TX_AVAIL_THRESH | (8188 >> 2));
-    ifq_dequeue(&ifp->if_snd, m0);
 
     VX_BUSY_WAIT;
     CSR_WRITE_2(sc, VX_COMMAND, SET_TX_START_THRESH |
@@ -604,7 +604,7 @@ vxintr(void *voidsc)
        if (status & S_TX_AVAIL) {
            ifp->if_timer = 0;
            ifp->if_flags &= ~IFF_OACTIVE;
-           vxstart(ifp);
+           if_devstart(ifp);
        }
        if (status & S_CARD_FAILURE) {
            if_printf(ifp, "adapter failure (%x)\n", status);
@@ -615,7 +615,7 @@ vxintr(void *voidsc)
        if (status & S_TX_COMPLETE) {
            ifp->if_timer = 0;
            vxtxstat(sc);
-           vxstart(ifp);
+           if_devstart(ifp);
        }
     }
     /* no more interrupts */
@@ -893,7 +893,7 @@ vxwatchdog(struct ifnet *ifp)
     if (ifp->if_flags & IFF_DEBUG)
        if_printf(ifp, "device timeout\n");
     ifp->if_flags &= ~IFF_OACTIVE;
-    vxstart(ifp);
+    if_devstart(ifp);
     vxintr(sc);
 }
 
index 6ecc884..92ee0ad 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/vx/if_vx_eisa.c,v 1.14 2000/01/29 14:50:31 peter Exp $
- * $DragonFly: src/sys/dev/netif/vx/if_vx_eisa.c,v 1.15 2006/10/25 20:55:59 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/vx/if_vx_eisa.c,v 1.16 2008/05/14 11:59:22 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -37,6 +37,7 @@
 #include <sys/module.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -103,12 +104,11 @@ vx_eisa_probe(device_t dev)
 static int
 vx_eisa_attach(device_t dev)
 {
-    struct vx_softc *sc;
+    struct vx_softc *sc = device_get_softc(dev);
+    struct ifnet *ifp = &sc->arpcom.ac_if;
     struct resource *eisa_io = NULL;
     int                    rid;
 
-    sc = device_get_softc(dev);
-
     /*
      * The addresses are sorted in increasing order
      * so we know the port to pass to the core ep
@@ -144,11 +144,15 @@ vx_eisa_attach(device_t dev)
 
     if (bus_setup_intr(dev, sc->vx_irq, INTR_NETSAFE, 
                       vxintr, sc, &sc->vx_intrhand,
-                      sc->arpcom.ac_if.if_serializer)
+                      ifp->if_serializer)
     ) {
        ether_ifdetach(&sc->arpcom.ac_if);
        goto bad;
     }
+
+    ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->vx_irq));
+    KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
     return 0;
 
  bad:
index 0558e66..df5d572 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/vx/if_vx_pci.c,v 1.21 2000/05/28 15:59:52 peter Exp $
- * $DragonFly: src/sys/dev/netif/vx/if_vx_pci.c,v 1.15 2006/12/22 23:26:22 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/vx/if_vx_pci.c,v 1.16 2008/05/14 11:59:22 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -36,6 +36,7 @@
 #include <sys/socket.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -132,11 +133,10 @@ vx_pci_probe(device_t dev)
 static int 
 vx_pci_attach(device_t dev)
 {
-    struct vx_softc *sc;
+    struct vx_softc *sc = device_get_softc(dev);
+    struct ifnet *ifp = &sc->arpcom.ac_if;
     int rid;
 
-    sc = device_get_softc(dev);
-
     rid = PCIR_MAPS;
     sc->vx_res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid,
        RF_ACTIVE);
@@ -174,12 +174,15 @@ vx_pci_attach(device_t dev)
 
     if (bus_setup_intr(dev, sc->vx_irq, INTR_NETSAFE,
                       vxintr, sc, &sc->vx_intrhand, 
-                      sc->arpcom.ac_if.if_serializer)
+                      ifp->if_serializer)
     ) {
        ether_ifdetach(&sc->arpcom.ac_if);
        goto bad;
     }
 
+    ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->vx_irq));
+    KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
     return(0);
 
 bad:
index 21f88a5..3a35f2e 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_wb.c,v 1.26.2.6 2003/03/05 18:42:34 njl Exp $
- * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.40 2008/01/05 14:02:37 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/wb/if_wb.c,v 1.41 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -96,6 +96,7 @@
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -819,6 +820,9 @@ wb_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->wb_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return(0);
 
 fail:
@@ -1180,7 +1184,7 @@ wb_intr(void *arg)
        CSR_WRITE_4(sc, WB_IMR, WB_INTRS);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               wb_start(ifp);
+               if_devstart(ifp);
 }
 
 static void
@@ -1566,7 +1570,7 @@ wb_watchdog(struct ifnet *ifp)
        wb_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               wb_start(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 4193580..34a966d 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/wi/if_wi.c,v 1.180.2.7 2005/10/05 13:16:29 avatar Exp $
- * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.40 2007/04/08 09:43:57 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/wi/if_wi.c,v 1.41 2008/05/14 11:59:22 sephe Exp $
  */
 
 /*
@@ -85,6 +85,7 @@
 #include <sys/serialize.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <machine/atomic.h>
 
@@ -500,6 +501,9 @@ wi_attach(device_t dev)
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        if (bootverbose)
                ieee80211_announce(ic);
 
@@ -575,9 +579,8 @@ wi_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                }
 
                if ((ifp->if_flags & IFF_OACTIVE) == 0 &&
-                   (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0 && !ifq_is_empty(&ifp->if_snd)) {
-                       wi_start(ifp);
-               }
+                   (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0)
+                       ifp->if_start(ifp);
                break;
        }
 }
@@ -609,14 +612,11 @@ wi_intr(void *arg)
        if (status & WI_EV_INFO)
                wi_info_intr(sc);
        if ((ifp->if_flags & IFF_OACTIVE) == 0 &&
-           (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0 &&
-           !ifq_is_empty(&ifp->if_snd))
-               wi_start(ifp);
+           (sc->sc_flags & WI_FLAGS_OUTRANGE) == 0)
+               ifp->if_start(ifp);
 
        /* Re-enable interrupts. */
        CSR_WRITE_2(sc, WI_INT_EN, WI_INTRS);
-
-       return;
 }
 
 void
@@ -850,8 +850,11 @@ wi_start(struct ifnet *ifp)
        struct wi_frame frmhdr;
        int cur, fid, off, error;
 
-       if (sc->wi_gone || (sc->sc_flags & WI_FLAGS_OUTRANGE))
+       if (sc->wi_gone || (sc->sc_flags & WI_FLAGS_OUTRANGE)) {
+               ieee80211_drain_mgtq(&ic->ic_mgtq);
+               ifq_purge(&ifp->if_snd);
                return;
+       }
 
        memset(&frmhdr, 0, sizeof(frmhdr));
        cur = sc->sc_txnext;
@@ -882,17 +885,20 @@ wi_start(struct ifnet *ifp)
                } else {
                        struct ether_header *eh;
 
-                       if (ic->ic_state != IEEE80211_S_RUN)
-                               break;
-                       m0 = ifq_poll(&ifp->if_snd);
-                       if (m0 == NULL)
+                       if (ic->ic_state != IEEE80211_S_RUN) {
+                               ifq_purge(&ifp->if_snd);
                                break;
+                       }
+
                        if (sc->sc_txd[cur].d_len != 0) {
                                ifp->if_flags |= IFF_OACTIVE;
                                break;
                        }
 
-                       ifq_dequeue(&ifp->if_snd, m0);
+                       m0 = ifq_dequeue(&ifp->if_snd, NULL);
+                       if (m0 == NULL)
+                               break;
+
                        if (m0->m_len < sizeof(struct ether_header)) {
                                m0 = m_pullup(m0, sizeof(struct ether_header));
                                if (m0 == NULL) {
index aca643a..740a174 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/i386/isa/if_wl.c,v 1.27.2.2 2000/07/17 21:24:32 archie Exp $ */
-/* $DragonFly: src/sys/dev/netif/wl/if_wl.c,v 1.30 2006/12/22 23:26:22 swildner Exp $ */
+/* $DragonFly: src/sys/dev/netif/wl/if_wl.c,v 1.31 2008/05/14 11:59:22 sephe Exp $ */
 /* 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -205,6 +205,7 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -560,6 +561,9 @@ wlattach(device_t dev)
        return error;
     }
 
+    ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->res_irq));
+    KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
     if (bootverbose)
        wldump(sc);
     return 0;
@@ -803,7 +807,7 @@ wlinit(void *xsc)
        sc->tbusy = 0;
        callout_stop(&sc->watchdog_ch);
                
-       wlstart(ifp);
+       if_devstart(ifp);
     } else {
        if_printf(ifp, "init(): trouble resetting board.\n");
     }
@@ -1645,7 +1649,7 @@ wlintr(void *arg)
            sc->tbusy = 0;
            callout_stop(&sc->watchdog_ch);
            ifp->if_flags &= ~IFF_OACTIVE;
-           wlstart(ifp);
+           if_devstart(ifp);
        }
     }
 }
index b064777..ac35d64 100644 (file)
@@ -25,7 +25,7 @@
  *
  *     $Id: if_xe.c,v 1.20 1999/06/13 19:17:40 scott Exp $
  * $FreeBSD: src/sys/dev/xe/if_xe.c,v 1.39 2003/10/14 22:51:35 rsm Exp $
- * $DragonFly: src/sys/dev/netif/xe/if_xe.c,v 1.34 2006/12/22 23:26:22 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/xe/if_xe.c,v 1.35 2008/05/14 11:59:23 sephe Exp $
  */
 
 /*
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
  
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -330,14 +331,17 @@ xe_attach (device_t dev)
 
   err = bus_setup_intr(dev, scp->irq_res, INTR_NETSAFE,
                       xe_intr, scp, &scp->intrhand,
-                      scp->arpcom.ac_if.if_serializer);
+                      scp->ifp->if_serializer);
   if (err) {
     device_printf(dev, "Setup intr failed\n");
-    ether_ifdetach(&scp->arpcom.ac_if);
+    ether_ifdetach(scp->ifp);
     xe_deactivate(dev);
     return err;
   }
 
+  scp->ifp->if_cpuid = ithread_cpuid(rman_get_start(scp->irq_res));
+  KKASSERT(scp->ifp->if_cpuid >= 0 && scp->ifp->if_cpuid < ncpus);
+
   /* Done */
   return 0;
 }
@@ -482,15 +486,15 @@ xe_start(struct ifnet *ifp) {
    * Loop while there are packets to be sent, and space to send them.
    */
   while (1) {
-    mbp = ifq_poll(&ifp->if_snd);      /* Suck a packet off the send queue */
-
+    /* Suck a packet off the send queue */
+    mbp = ifq_dequeue(&ifp->if_snd, NULL);
     if (mbp == NULL) {
       /*
-       * We are using the !OACTIVE flag to indicate to the outside world that
-       * we can accept an additional packet rather than that the transmitter
-       * is _actually_ active. Indeed, the transmitter may be active, but if
-       * we haven't filled all the buffers with data then we still want to
-       * accept more.
+       * We are using the !OACTIVE flag to indicate to the outside
+       * world that we can accept an additional packet rather than
+       * that the transmitter is _actually_ active. Indeed, the
+       * transmitter may be active, but if we haven't filled all
+       * the buffers with data then we still want to accept more.
        */
       ifp->if_flags &= ~IFF_OACTIVE;
       return;
@@ -498,13 +502,13 @@ xe_start(struct ifnet *ifp) {
 
     if (xe_pio_write_packet(scp, mbp) != 0) {
       ifp->if_flags |= IFF_OACTIVE;
+      ifq_prepend(&ifp->if_snd, mbp);
       return;
     }
 
-    ifq_dequeue(&ifp->if_snd, mbp);
     BPF_MTAP(ifp, mbp);
 
-    ifp->if_timer = 5;                 /* In case we don't hear from the card again */
+    ifp->if_timer = 5; /* In case we don't hear from the card again */
     scp->tx_queued++;
 
     m_freem(mbp);
@@ -1175,7 +1179,7 @@ xe_setmedia_serialized(void *xscp)
   /* Restart output? */
   xe_enable_intr(scp);
   scp->ifp->if_flags &= ~IFF_OACTIVE;
-  xe_start(scp->ifp);
+  if_devstart(scp->ifp);
 }
 
 
index af68415..c096c1f 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_xl.c,v 1.72.2.28 2003/10/08 06:01:57 murray Exp $
- * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.49 2007/08/14 13:30:35 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.50 2008/05/14 11:59:23 sephe Exp $
  */
 
 /*
 #include <sys/bus.h>
 #include <sys/rman.h>
 #include <sys/thread2.h>
+#include <sys/interrupt.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -214,6 +215,7 @@ static void xl_txeoc                (struct xl_softc *);
 static void xl_intr            (void *);
 static void xl_start_body      (struct ifnet *, int);
 static void xl_start           (struct ifnet *);
+static void xl_start_poll      (struct ifnet *);
 static void xl_start_90xB      (struct ifnet *);
 static int xl_ioctl            (struct ifnet *, u_long, caddr_t,
                                                struct ucred *);
@@ -1605,6 +1607,9 @@ done:
                goto fail;
        }
 
+       ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->xl_irq));
+       KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
+
        return 0;
 
 fail:
@@ -2334,8 +2339,12 @@ xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
        switch (cmd) {
        case POLL_REGISTER:
                xl_enable_intrs(sc, 0);
+               if (sc->xl_type != XL_TYPE_905B)
+                       ifp->if_start = xl_start_poll;
                break;
        case POLL_DEREGISTER:
+               if (sc->xl_type != XL_TYPE_905B)
+                       ifp->if_start = xl_start;
                xl_enable_intrs(sc, XL_INTRS);
                break;
        case POLL_ONLY:
@@ -2346,12 +2355,8 @@ xl_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                else
                        xl_txeof(sc);
 
-               if (!ifq_is_empty(&ifp->if_snd)) {
-                       if (sc->xl_type == XL_TYPE_905B)
-                               xl_start_90xB(ifp);
-                       else
-                               xl_start_body(ifp, 0);
-               }
+               if (!ifq_is_empty(&ifp->if_snd))
+                       if_devstart(ifp);
 
                if (cmd == POLL_AND_CHECK_STATUS) {
                        uint16_t status;
@@ -2437,9 +2442,7 @@ xl_intr(void *arg)
        }
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
-
-       return;
+               if_devstart(ifp);
 }
 
 static void
@@ -2583,6 +2586,12 @@ xl_start(struct ifnet *ifp)
        xl_start_body(ifp, 1);
 }
 
+static void
+xl_start_poll(struct ifnet *ifp)
+{
+       xl_start_body(ifp, 0);
+}
+
 /*
  * Main transmit routine. To avoid having to do mbuf copies, we put pointers
  * to the mbuf data regions directly in the transmit lists. We also save a
@@ -2725,7 +2734,7 @@ xl_start_90xB(struct ifnet *ifp)
 
        sc = ifp->if_softc;
 
-       if (ifp->if_flags & IFF_OACTIVE)
+       if ((ifp->if_flags & (IFF_OACTIVE | IFF_RUNNING)) != IFF_RUNNING)
                return;
 
        idx = sc->xl_cdata.xl_tx_prod;
@@ -3212,7 +3221,7 @@ xl_watchdog(struct ifnet *ifp)
        xl_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               (*ifp->if_start)(ifp);
+               if_devstart(ifp);
 }
 
 /*
index 7fb21fd..ab4acc9 100644 (file)
@@ -24,7 +24,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_intr.c,v 1.24.2.1 2001/10/14 20:05:50 luigi Exp $
- * $DragonFly: src/sys/kern/kern_intr.c,v 1.52 2008/03/30 14:40:13 hasso Exp $
+ * $DragonFly: src/sys/kern/kern_intr.c,v 1.53 2008/05/14 11:59:23 sephe Exp $
  *
  */
 
@@ -951,6 +951,19 @@ emergency_intr_timer_callback(systimer_t info, struct intrframe *frame __unused)
        lwkt_schedule(info->data);
 }
 
+int
+ithread_cpuid(int intr)
+{
+       const struct intr_info *info;
+
+       KKASSERT(intr >= 0 && intr < MAX_INTS);
+       info = &intr_info_ary[intr];
+
+       if (info->i_state == ISTATE_NOTHREAD)
+               return -1;
+       return info->i_thread.td_gd->gd_cpuid;
+}
+
 /* 
  * Sysctls used by systat and others: hw.intrnames and hw.intrcnt.
  * The data for this machine dependent, and the declarations are in machine
index e7e251e..2b4ff0b 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/lwkt_serialize.c,v 1.15 2008/05/05 12:35:03 sephe Exp $
+ * $DragonFly: src/sys/kern/lwkt_serialize.c,v 1.16 2008/05/14 11:59:23 sephe Exp $
  */
 /*
  * This API provides a fast locked-bus-cycle-based serializer.  It's
@@ -95,12 +95,11 @@ KTR_INFO(KTR_SERIALIZER, slz, exit_beg, 11, SLZ_KTR_STRING, SLZ_KTR_ARG_SIZE);
 #define logslz_spinbo(slz, bo1, bo)    KTR_LOG(slz_spinbo, slz, bo1, bo)
 
 static void lwkt_serialize_sleep(void *info);
-#ifdef SMP
-static void lwkt_serialize_adaptive_sleep(void *bo);
-#endif
 static void lwkt_serialize_wakeup(void *info);
 
 #ifdef SMP
+static void lwkt_serialize_adaptive_sleep(void *bo);
+
 static int slz_backoff_limit = 128;
 SYSCTL_INT(_debug, OID_AUTO, serialize_bolimit, CTLFLAG_RW,
           &slz_backoff_limit, 0, "");
@@ -119,9 +118,8 @@ void
 lwkt_serialize_init(lwkt_serialize_t s)
 {
     atomic_intr_init(&s->interlock);
-#ifdef INVARIANTS
     s->last_td = (void *)-4;
-#endif
+
     s->sleep_cnt = 0;
     s->tryfail_cnt = 0;
     s->enter_cnt = 0;
@@ -129,7 +127,6 @@ lwkt_serialize_init(lwkt_serialize_t s)
 }
 
 #ifdef SMP
-
 void
 lwkt_serialize_adaptive_enter(lwkt_serialize_t s)
 {
@@ -139,34 +136,29 @@ lwkt_serialize_adaptive_enter(lwkt_serialize_t s)
     bo.round = 0;
     bo.s = s;
 
-#ifdef INVARIANTS
-    KKASSERT(s->last_td != curthread);
-#endif
+    ASSERT_NOT_SERIALIZED(s);
+
     logslz(enter_beg, s);
     atomic_intr_cond_enter(&s->interlock, lwkt_serialize_adaptive_sleep, &bo);
     logslz(enter_end, s);
-#ifdef INVARIANTS
+
     s->last_td = curthread;
-#endif
 #ifdef PROFILE_SERIALIZER
     s->enter_cnt++;
 #endif
 }
-
 #endif /* SMP */
 
 void
 lwkt_serialize_enter(lwkt_serialize_t s)
 {
-#ifdef INVARIANTS
-    KKASSERT(s->last_td != curthread);
-#endif
+    ASSERT_NOT_SERIALIZED(s);
+
     logslz(enter_beg, s);
     atomic_intr_cond_enter(&s->interlock, lwkt_serialize_sleep, s);
     logslz(enter_end, s);
-#ifdef INVARIANTS
+
     s->last_td = curthread;
-#endif
 #ifdef PROFILE_SERIALIZER
     s->enter_cnt++;
 #endif
@@ -180,17 +172,14 @@ lwkt_serialize_try(lwkt_serialize_t s)
 {
     int error;
 
-#ifdef INVARIANTS
-    KKASSERT(s->last_td != curthread);
-#endif
+    ASSERT_NOT_SERIALIZED(s);
+
 #ifdef PROFILE_SERIALIZER
     s->try_cnt++;
 #endif
     logslz(try, s);
     if ((error = atomic_intr_cond_try(&s->interlock)) == 0) {
-#ifdef INVARIANTS
        s->last_td = curthread;
-#endif
        logslz(tryok, s);
        return(1);
     }
@@ -204,10 +193,9 @@ lwkt_serialize_try(lwkt_serialize_t s)
 void
 lwkt_serialize_exit(lwkt_serialize_t s)
 {
-#ifdef INVARIANTS
-    KKASSERT(s->last_td == curthread);
+    ASSERT_SERIALIZED(s);
     s->last_td = (void *)-2;
-#endif
+
     logslz(exit_beg, s);
     atomic_intr_cond_exit(&s->interlock, lwkt_serialize_wakeup, s);
     logslz(exit_end, s);
@@ -241,18 +229,17 @@ lwkt_serialize_handler_call(lwkt_serialize_t s, void (*func)(void *, void *),
        logslz(enter_beg, s);
        atomic_intr_cond_enter(&s->interlock, lwkt_serialize_sleep, s);
        logslz(enter_end, s);
-#ifdef INVARIANTS
+
        s->last_td = curthread;
-#endif
 #ifdef PROFILE_SERIALIZER
        s->enter_cnt++;
 #endif
        if (atomic_intr_handler_is_enabled(&s->interlock) == 0)
            func(arg, frame);
-#ifdef INVARIANTS
-       KKASSERT(s->last_td == curthread);
+
+       ASSERT_SERIALIZED(s);
        s->last_td = (void *)-2;
-#endif
+
        logslz(exit_beg, s);
        atomic_intr_cond_exit(&s->interlock, lwkt_serialize_wakeup, s);
        logslz(exit_end, s);
@@ -277,15 +264,14 @@ lwkt_serialize_handler_try(lwkt_serialize_t s, void (*func)(void *, void *),
 #endif
        logslz(try, s);
        if (atomic_intr_cond_try(&s->interlock) == 0) {
-#ifdef INVARIANTS
            s->last_td = curthread;
-#endif
            logslz(tryok, s);
+
            func(arg, frame);
-#ifdef INVARIANTS
-           KKASSERT(s->last_td == curthread);
+
+           ASSERT_SERIALIZED(s);
            s->last_td = (void *)-2;
-#endif
+
            logslz(exit_beg, s);
            atomic_intr_cond_exit(&s->interlock, lwkt_serialize_wakeup, s);
            logslz(exit_end, s);
index 60cd22f..c24611b 100644 (file)
@@ -1,5 +1,5 @@
 /*     $KAME: altq_cbq.c,v 1.20 2004/04/17 10:54:48 kjc Exp $  */
-/*     $DragonFly: src/sys/net/altq/altq_cbq.c,v 1.6 2006/12/22 23:44:55 swildner Exp $ */
+/*     $DragonFly: src/sys/net/altq/altq_cbq.c,v 1.7 2008/05/14 11:59:23 sephe Exp $ */
 
 /*
  * Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved.
@@ -201,18 +201,10 @@ get_class_stats(class_stats_t *statsp, struct rm_class *cl)
 }
 
 int
-cbq_pfattach(struct pf_altq *a)
+cbq_pfattach(struct pf_altq *a, struct ifaltq *ifq)
 {
-       struct ifnet    *ifp;
-       int error;
-
-       if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
-               return (EINVAL);
-       crit_enter();
-       error = altq_attach(&ifp->if_snd, ALTQT_CBQ, a->altq_disc,
+       return altq_attach(ifq, ALTQT_CBQ, a->altq_disc,
            cbq_enqueue, cbq_dequeue, cbq_request, NULL, NULL);
-       crit_exit();
-       return (error);
 }
 
 int
@@ -261,19 +253,15 @@ cbq_remove_altq(struct pf_altq *a)
        return (0);
 }
 
-int
-cbq_add_queue(struct pf_altq *a)
+static int
+cbq_add_queue_locked(struct pf_altq *a, cbq_state_t *cbqp)
 {
        struct rm_class *borrow, *parent;
-       cbq_state_t     *cbqp;
        struct rm_class *cl;
        struct cbq_opts *opts;
        int             i;
 
-       if ((cbqp = a->altq_disc) == NULL)
-               return (EINVAL);
-       if (a->qid == 0)
-               return (EINVAL);
+       KKASSERT(a->qid != 0);
 
        /*
         * find a free slot in the class table.  if the slot matching
@@ -372,14 +360,32 @@ cbq_add_queue(struct pf_altq *a)
 }
 
 int
-cbq_remove_queue(struct pf_altq *a)
+cbq_add_queue(struct pf_altq *a)
 {
-       struct rm_class *cl;
-       cbq_state_t     *cbqp;
-       int             i;
+       cbq_state_t *cbqp;
+       struct ifaltq *ifq;
+       int error;
+
+       if (a->qid == 0)
+               return (EINVAL);
 
+       /* XXX not MP safe */
        if ((cbqp = a->altq_disc) == NULL)
                return (EINVAL);
+       ifq = cbqp->ifnp.ifq_;
+
+       ALTQ_LOCK(ifq);
+       error = cbq_add_queue_locked(a, cbqp);
+       ALTQ_UNLOCK(ifq);
+
+       return error;
+}
+
+static int
+cbq_remove_queue_locked(struct pf_altq *a, cbq_state_t *cbqp)
+{
+       struct rm_class *cl;
+       int             i;
 
        if ((cl = clh_to_clp(cbqp, a->qid)) == NULL)
                return (EINVAL);
@@ -407,6 +413,25 @@ cbq_remove_queue(struct pf_altq *a)
        return (0);
 }
 
+int
+cbq_remove_queue(struct pf_altq *a)
+{
+       cbq_state_t *cbqp;
+       struct ifaltq *ifq;
+       int error;
+
+       /* XXX not MP safe */
+       if ((cbqp = a->altq_disc) == NULL)
+               return (EINVAL);
+       ifq = cbqp->ifnp.ifq_;
+
+       ALTQ_LOCK(ifq);
+       error = cbq_remove_queue_locked(a, cbqp);
+       ALTQ_UNLOCK(ifq);
+
+       return error;
+}
+
 int
 cbq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
 {
@@ -414,18 +439,27 @@ cbq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
        struct rm_class *cl;
        class_stats_t    stats;
        int              error = 0;
+       struct ifaltq   *ifq;
+
+       if (*nbytes < sizeof(stats))
+               return (EINVAL);
 
+       /* XXX not MP safe */
        if ((cbqp = altq_lookup(a->ifname, ALTQT_CBQ)) == NULL)
                return (EBADF);
+       ifq = cbqp->ifnp.ifq_;
 
-       if ((cl = clh_to_clp(cbqp, a->qid)) == NULL)
-               return (EINVAL);
+       ALTQ_LOCK(ifq);
 
-       if (*nbytes < sizeof(stats))
+       if ((cl = clh_to_clp(cbqp, a->qid)) == NULL) {
+               ALTQ_UNLOCK(ifq);
                return (EINVAL);
+       }
 
        get_class_stats(&stats, cl);
 
+       ALTQ_UNLOCK(ifq);
+
        if ((error = copyout((caddr_t)&stats, ubuf, sizeof(stats))) != 0)
                return (error);
        *nbytes = sizeof(stats);
index f07f342..e171aff 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/net/altq/altq_fairq.c,v 1.1 2008/04/06 18:58:15 dillon Exp $
+ * $DragonFly: src/sys/net/altq/altq_fairq.c,v 1.2 2008/05/14 11:59:23 sephe Exp $
  */
 /*
  * Matt: I gutted altq_priq.c and used it as a skeleton on which to build
@@ -133,18 +133,10 @@ static void       get_class_stats(struct fairq_classstats *, struct fairq_class *);
 static struct fairq_class *clh_to_clp(struct fairq_if *, uint32_t);
 
 int
-fairq_pfattach(struct pf_altq *a)
+fairq_pfattach(struct pf_altq *a, struct ifaltq *ifq)
 {
-       struct ifnet *ifp;
-       int error;
-
-       if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
-               return (EINVAL);
-       crit_enter();
-       error = altq_attach(&ifp->if_snd, ALTQT_FAIRQ, a->altq_disc,
+       return altq_attach(ifq, ALTQT_FAIRQ, a->altq_disc,
            fairq_enqueue, fairq_dequeue, fairq_request, NULL, NULL);
-       crit_exit();
-       return (error);
 }
 
 int
@@ -185,20 +177,14 @@ fairq_remove_altq(struct pf_altq *a)
        return (0);