ether: Don't manually packing up input mbufs
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 13 Apr 2012 03:58:58 +0000 (11:58 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 13 Apr 2012 04:00:39 +0000 (12:00 +0800)
Since we use spin ports for netisrs now, we no longer need to explicitly
avoid IPI storm on input path.

17 files changed:
sys/dev/netif/bce/if_bce.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/em/if_em.c
sys/dev/netif/emx/if_emx.c
sys/dev/netif/et/if_et.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/jme/if_jme.c
sys/dev/netif/msk/if_msk.c
sys/dev/netif/mxge/if_mxge.c
sys/dev/netif/nfe/if_nfe.c
sys/dev/netif/re/if_re.c
sys/dev/netif/xl/if_xl.c
sys/net/if_ethersubr.c
sys/net/if_var.h
sys/net/netisr.h
sys/sys/mbuf.h

index b07bbfd..827615a 100644 (file)
@@ -4297,12 +4297,9 @@ bce_rx_intr(struct bce_softc *sc, int count)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        uint16_t hw_cons, sw_cons, sw_chain_cons, sw_prod, sw_chain_prod;
        uint32_t sw_prod_bseq;
-       struct mbuf_chain chain[MAXCPU];
 
        ASSERT_SERIALIZED(ifp->if_serializer);
 
-       ether_input_chain_init(chain);
-
        DBRUNIF(1, sc->rx_interrupts++);
 
        /* Get the hardware's view of the RX consumer index. */
@@ -4542,7 +4539,7 @@ bce_rx_int_next_rx:
                                m->m_pkthdr.ether_vlantag =
                                        l2fhdr->l2_fhdr_vlan_tag;
                        }
-                       ether_input_chain(ifp, m, NULL, chain);
+                       ifp->if_input(ifp, m);
 
                        DBRUNIF(1, sc->rx_mbuf_alloc--);
                }
@@ -4566,8 +4563,6 @@ bce_rx_int_next_rx:
                                  BUS_SPACE_BARRIER_READ);
        }
 
-       ether_input_dispatch(chain);
-
        sc->rx_cons = sw_cons;
        sc->rx_prod = sw_prod;
        sc->rx_prod_bseq = sw_prod_bseq;
index 276bbd7..d79505a 100644 (file)
@@ -1106,14 +1106,11 @@ bfe_rxeof(struct bfe_softc *sc)
        struct bfe_rxheader *rxheader;
        struct bfe_data *r;
        uint32_t cons, status, current, len, flags;
-       struct mbuf_chain chain[MAXCPU];
 
        cons = sc->bfe_rx_cons;
        status = CSR_READ_4(sc, BFE_DMARX_STAT);
        current = (status & BFE_STAT_CDMASK) / sizeof(struct bfe_desc);
 
-       ether_input_chain_init(chain);
-
        while (current != cons) {
                r = &sc->bfe_rx_ring[cons];
                bus_dmamap_sync(sc->bfe_rxbuf_tag, r->bfe_map,
@@ -1150,12 +1147,10 @@ bfe_rxeof(struct bfe_softc *sc)
                ifp->if_ipackets++;
                m->m_pkthdr.rcvif = ifp;
 
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
                BFE_INC(cons, BFE_RX_LIST_CNT);
        }
 
-       ether_input_dispatch(chain);
-
        sc->bfe_rx_cons = cons;
 }
 
index 4a2154b..1758d68 100644 (file)
@@ -2374,14 +2374,11 @@ bge_rxeof(struct bge_softc *sc)
 {
        struct ifnet *ifp;
        int stdcnt = 0, jumbocnt = 0;
-       struct mbuf_chain chain[MAXCPU];
 
        if (sc->bge_rx_saved_considx ==
            sc->bge_ldata.bge_status_block->bge_idx[0].bge_rx_prod_idx)
                return;
 
-       ether_input_chain_init(chain);
-
        ifp = &sc->arpcom.ac_if;
 
        while (sc->bge_rx_saved_considx !=
@@ -2493,11 +2490,9 @@ bge_rxeof(struct bge_softc *sc)
                        m->m_pkthdr.ether_vlantag = vlan_tag;
                        have_tag = vlan_tag = 0;
                }
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
        }
 
-       ether_input_dispatch(chain);
-
        bge_writembx(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx);
        if (stdcnt)
                bge_writembx(sc, BGE_MBX_RX_STD_PROD_LO, sc->bge_std);
index 7aa5d56..8ca6336 100644 (file)
@@ -3272,7 +3272,6 @@ em_rxeof(struct adapter *adapter, int count)
        struct e1000_rx_desc *current_desc;
        struct mbuf *mp;
        int i;
-       struct mbuf_chain chain[MAXCPU];
 
        i = adapter->next_rx_desc_to_check;
        current_desc = &adapter->rx_desc_base[i];
@@ -3280,8 +3279,6 @@ em_rxeof(struct adapter *adapter, int count)
        if (!(current_desc->status & E1000_RXD_STAT_DD))
                return;
 
-       ether_input_chain_init(chain);
-
        while ((current_desc->status & E1000_RXD_STAT_DD) && count != 0) {
                struct mbuf *m = NULL;
 
@@ -3412,7 +3409,7 @@ discard:
                current_desc->status = 0;
 
                if (m != NULL)
-                       ether_input_chain(ifp, m, NULL, chain);
+                       ifp->if_input(ifp, m);
 
                /* Advance our pointers to the next descriptor. */
                if (++i == adapter->num_rx_desc)
@@ -3421,8 +3418,6 @@ discard:
        }
        adapter->next_rx_desc_to_check = i;
 
-       ether_input_dispatch(chain);
-
        /* Advance the E1000's Receive Queue #0  "Tail Pointer". */
        if (--i < 0)
                i = adapter->num_rx_desc - 1;
index e741f04..fb71099 100644 (file)
@@ -2828,7 +2828,6 @@ emx_rxeof(struct emx_softc *sc, int ring_idx, int count)
        emx_rxdesc_t *current_desc;
        struct mbuf *mp;
        int i;
-       struct mbuf_chain chain[MAXCPU];
 
        i = rdata->next_rx_desc_to_check;
        current_desc = &rdata->rx_desc[i];
@@ -2837,8 +2836,6 @@ emx_rxeof(struct emx_softc *sc, int ring_idx, int count)
        if (!(staterr & E1000_RXD_STAT_DD))
                return;
 
-       ether_input_chain_init(chain);
-
        while ((staterr & E1000_RXD_STAT_DD) && count != 0) {
                struct pktinfo *pi = NULL, pi0;
                struct emx_rxbuf *rx_buf = &rdata->rx_buf[i];
@@ -2940,7 +2937,7 @@ discard:
                }
 
                if (m != NULL)
-                       ether_input_chain(ifp, m, pi, chain);
+                       ether_input_pkt(ifp, m, pi);
 
                /* Advance our pointers to the next descriptor. */
                if (++i == rdata->num_rx_desc)
@@ -2951,8 +2948,6 @@ discard:
        }
        rdata->next_rx_desc_to_check = i;
 
-       ether_input_dispatch(chain);
-
        /* Advance the E1000's Receive Queue "Tail Pointer". */
        if (--i < 0)
                i = rdata->num_rx_desc - 1;
index d75590a..d1dc4a0 100644 (file)
@@ -1844,7 +1844,6 @@ et_rxeof(struct et_softc *sc)
        struct et_rxstat_ring *rxst_ring = &sc->sc_rxstat_ring;
        uint32_t rxs_stat_ring;
        int rxst_wrap, rxst_index;
-       struct mbuf_chain chain[MAXCPU];
 
        if ((sc->sc_flags & ET_FLAG_TXRX_ENABLED) == 0)
                return;
@@ -1853,8 +1852,6 @@ et_rxeof(struct et_softc *sc)
        rxst_wrap = (rxs_stat_ring & ET_RXS_STATRING_WRAP) ? 1 : 0;
        rxst_index = __SHIFTOUT(rxs_stat_ring, ET_RXS_STATRING_INDEX);
 
-       ether_input_chain_init(chain);
-
        while (rxst_index != rxst_ring->rsr_index ||
               rxst_wrap != rxst_ring->rsr_wrap) {
                struct et_rxbuf_data *rbd;
@@ -1906,7 +1903,7 @@ et_rxeof(struct et_softc *sc)
                                m_adj(m, -ETHER_CRC_LEN);
 
                                ifp->if_ipackets++;
-                               ether_input_chain(ifp, m, NULL, chain);
+                               ifp->if_input(ifp, m);
                        }
                } else {
                        ifp->if_ierrors++;
@@ -1931,8 +1928,6 @@ et_rxeof(struct et_softc *sc)
                        rxring_pos |= ET_RX_RING_POS_WRAP;
                CSR_WRITE_4(sc, rx_ring->rr_posreg, rxring_pos);
        }
-
-       ether_input_dispatch(chain);
 }
 
 static int
index 0a34c33..531133f 100644 (file)
@@ -1270,7 +1270,6 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
        struct mbuf *m;
        struct fxp_rfa *rfa;
        int rnr = (statack & FXP_SCB_STATACK_RNR) ? 1 : 0;
-       struct mbuf_chain chain[MAXCPU];
 
        if (rnr)
                fxp_rnr++;
@@ -1333,8 +1332,6 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
        if (!rnr && (statack & FXP_SCB_STATACK_FR) == 0)
                return;
 
-       ether_input_chain_init(chain);
-
        /*
         * Process receiver interrupts. If a no-resource (RNR)
         * condition exists, get whatever packets we can and
@@ -1397,12 +1394,10 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
                                continue;
                        }
                        m->m_pkthdr.len = m->m_len = total_len;
-                       ether_input_chain(ifp, m, NULL, chain);
+                       ifp->if_input(ifp, m);
                }
        }
 
-       ether_input_dispatch(chain);
-
        if (rnr) {
                fxp_scb_wait(sc);
                CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL,
index b004004..d5b0f8f 100644 (file)
@@ -118,9 +118,7 @@ static void jme_intr(void *);
 static void    jme_msix_tx(void *);
 static void    jme_msix_rx(void *);
 static void    jme_txeof(struct jme_softc *);
-static void    jme_rxeof(struct jme_softc *, int);
-static int     jme_rxeof_chain(struct jme_softc *, int,
-                               struct mbuf_chain *, int);
+static void    jme_rxeof(struct jme_softc *, int, int);
 static void    jme_rx_intr(struct jme_softc *, uint32_t);
 
 static int     jme_msix_setup(device_t);
@@ -138,7 +136,7 @@ static void jme_init_tx_ring(struct jme_softc *);
 static void    jme_init_ssb(struct jme_softc *);
 static int     jme_newbuf(struct jme_softc *, int, struct jme_rxdesc *, int);
 static int     jme_encap(struct jme_softc *, struct mbuf **);
-static void    jme_rxpkt(struct jme_softc *, int, struct mbuf_chain *);
+static void    jme_rxpkt(struct jme_softc *, int);
 static int     jme_rxring_dma_alloc(struct jme_softc *, int);
 static int     jme_rxbuf_dma_alloc(struct jme_softc *, int);
 
@@ -385,7 +383,7 @@ jme_miibus_statchg(device_t dev)
        for (r = 0; r < sc->jme_rx_ring_inuse; ++r) {
                struct jme_rxdata *rdata = &sc->jme_cdata.jme_rx_data[r];
 
-               jme_rxeof(sc, r);
+               jme_rxeof(sc, r, -1);
                if (rdata->jme_rxhead != NULL)
                        m_freem(rdata->jme_rxhead);
                JME_RXCHAIN_RESET(sc, r);
@@ -2090,7 +2088,7 @@ jme_pktinfo(struct pktinfo *pi, uint32_t flags)
 
 /* Receive a frame. */
 static void
-jme_rxpkt(struct jme_softc *sc, int ring, struct mbuf_chain *chain)
+jme_rxpkt(struct jme_softc *sc, int ring)
 {
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct jme_rxdata *rdata = &sc->jme_cdata.jme_rx_data[ring];
@@ -2237,7 +2235,7 @@ jme_rxpkt(struct jme_softc *sc, int ring, struct mbuf_chain *chain)
 #endif
 
                        /* Pass it on. */
-                       ether_input_chain(ifp, m, pi, chain);
+                       ether_input_pkt(ifp, m, pi);
 
                        /* Reset mbuf chains. */
                        JME_RXCHAIN_RESET(sc, ring);
@@ -2251,15 +2249,13 @@ jme_rxpkt(struct jme_softc *sc, int ring, struct mbuf_chain *chain)
        rdata->jme_rx_cons %= sc->jme_rx_desc_cnt;
 }
 
-static int
-jme_rxeof_chain(struct jme_softc *sc, int ring, struct mbuf_chain *chain,
-               int count)
+static void
+jme_rxeof(struct jme_softc *sc, int ring, int count)
 {
        struct jme_rxdata *rdata = &sc->jme_cdata.jme_rx_data[ring];
        struct jme_desc *desc;
-       int nsegs, prog, pktlen;
+       int nsegs, pktlen;
 
-       prog = 0;
        for (;;) {
 #ifdef DEVICE_POLLING
                if (count >= 0 && count-- == 0)
@@ -2287,20 +2283,8 @@ jme_rxeof_chain(struct jme_softc *sc, int ring, struct mbuf_chain *chain,
                }
 
                /* Received a frame. */
-               jme_rxpkt(sc, ring, chain);
-               prog++;
+               jme_rxpkt(sc, ring);
        }
-       return prog;
-}
-
-static void
-jme_rxeof(struct jme_softc *sc, int ring)
-{
-       struct mbuf_chain chain[MAXCPU];
-
-       ether_input_chain_init(chain);
-       if (jme_rxeof_chain(sc, ring, chain, -1))
-               ether_input_dispatch(chain);
 }
 
 static void
@@ -3073,9 +3057,8 @@ static void
 jme_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
 {
        struct jme_softc *sc = ifp->if_softc;
-       struct mbuf_chain chain[MAXCPU];
        uint32_t status;
-       int r, prog = 0;
+       int r;
 
        ASSERT_SERIALIZED(&sc->jme_serialize);
 
@@ -3092,17 +3075,14 @@ jme_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
        case POLL_ONLY:
                status = CSR_READ_4(sc, JME_INTR_STATUS);
 
-               ether_input_chain_init(chain);
                for (r = 0; r < sc->jme_rx_ring_inuse; ++r) {
                        struct jme_rxdata *rdata =
                            &sc->jme_cdata.jme_rx_data[r];
 
                        lwkt_serialize_enter(&rdata->jme_rx_serialize);
-                       prog += jme_rxeof_chain(sc, r, chain, count);
+                       jme_rxeof(sc, r, count);
                        lwkt_serialize_exit(&rdata->jme_rx_serialize);
                }
-               if (prog)
-                       ether_input_dispatch(chain);
 
                if (status & INTR_RXQ_DESC_EMPTY) {
                        CSR_WRITE_4(sc, JME_INTR_STATUS, status);
@@ -3209,22 +3189,18 @@ jme_rxbuf_dma_alloc(struct jme_softc *sc, int ring)
 static void
 jme_rx_intr(struct jme_softc *sc, uint32_t status)
 {
-       struct mbuf_chain chain[MAXCPU];
-       int r, prog = 0;
+       int r;
 
-       ether_input_chain_init(chain);
        for (r = 0; r < sc->jme_rx_ring_inuse; ++r) {
                if (status & jme_rx_status[r].jme_coal) {
                        struct jme_rxdata *rdata =
                            &sc->jme_cdata.jme_rx_data[r];
 
                        lwkt_serialize_enter(&rdata->jme_rx_serialize);
-                       prog += jme_rxeof_chain(sc, r, chain, -1);
+                       jme_rxeof(sc, r, -1);
                        lwkt_serialize_exit(&rdata->jme_rx_serialize);
                }
        }
-       if (prog)
-               ether_input_dispatch(chain);
 }
 
 static void
@@ -3697,17 +3673,8 @@ jme_msix_rx(void *xrdata)
        }
 
        if (ifp->if_flags & IFF_RUNNING) {
-               if (status & rdata->jme_rx_coal) {
-                       struct mbuf_chain chain[MAXCPU];
-                       int prog;
-
-                       ether_input_chain_init(chain);
-
-                       prog = jme_rxeof_chain(sc, rdata->jme_rx_idx,
-                           chain, -1);
-                       if (prog)
-                               ether_input_dispatch(chain);
-               }
+               if (status & rdata->jme_rx_coal)
+                       jme_rxeof(sc, rdata->jme_rx_idx, -1);
 
                if (status & rdata->jme_rx_empty) {
                        CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr |
index b9a3452..efbcab0 100644 (file)
@@ -267,8 +267,7 @@ static void msk_intr_gmac(struct msk_if_softc *);
 static __inline void
                msk_rxput(struct msk_if_softc *);
 static void    msk_handle_hwerr(struct msk_if_softc *, uint32_t);
-static void    msk_rxeof(struct msk_if_softc *, uint32_t, int,
-                         struct mbuf_chain *);
+static void    msk_rxeof(struct msk_if_softc *, uint32_t, int);
 static void    msk_txeof(struct msk_if_softc *, int);
 static void    msk_set_prefetch(struct msk_softc *, int, bus_addr_t, uint32_t);
 static void    msk_set_rambuffer(struct msk_if_softc *);
@@ -2782,8 +2781,7 @@ mskc_resume(device_t dev)
 }
 
 static void
-msk_rxeof(struct msk_if_softc *sc_if, uint32_t status, int len,
-         struct mbuf_chain *chain)
+msk_rxeof(struct msk_if_softc *sc_if, uint32_t status, int len)
 {
        struct mbuf *m;
        struct ifnet *ifp;
@@ -2838,7 +2836,7 @@ msk_rxeof(struct msk_if_softc *sc_if, uint32_t status, int len,
                }
 #endif
 
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
        } while (0);
 
        MSK_INC(sc_if->msk_cdata.msk_rx_cons, MSK_RX_RING_CNT);
@@ -3162,14 +3160,11 @@ mskc_handle_events(struct msk_softc *sc)
        struct msk_stat_desc *sd;
        uint32_t control, status;
        int cons, idx, len, port, rxprog;
-       struct mbuf_chain chain[MAXCPU];
 
        idx = CSR_READ_2(sc, STAT_PUT_IDX);
        if (idx == sc->msk_stat_cons)
                return (0);
 
-       ether_input_chain_init(chain);
-
        rxput[MSK_PORT_A] = rxput[MSK_PORT_B] = 0;
 
        rxprog = 0;
@@ -3212,7 +3207,7 @@ mskc_handle_events(struct msk_softc *sc)
                                msk_jumbo_rxeof(sc_if, status, len);
                        else
 #endif
-                               msk_rxeof(sc_if, status, len, chain);
+                               msk_rxeof(sc_if, status, len);
                        rxprog++;
                        /*
                         * Because there is no way to sync single Rx LE
@@ -3249,9 +3244,6 @@ mskc_handle_events(struct msk_softc *sc)
                        break;
        }
 
-       if (rxprog > 0)
-               ether_input_dispatch(chain);
-
        sc->msk_stat_cons = cons;
        /* XXX We should sync status LEs here. See above notes. */
 
index c80a6b4..fc87606 100644 (file)
@@ -2535,8 +2535,7 @@ mxge_vlan_tag_remove(struct mbuf *m, uint32_t *csum)
 
 
 static inline void
-mxge_rx_done_big(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
-                  struct mbuf_chain *chain)
+mxge_rx_done_big(struct mxge_slice_state *ss, uint32_t len, uint32_t csum)
 {
        mxge_softc_t *sc;
        struct ifnet *ifp;
@@ -2598,12 +2597,11 @@ mxge_rx_done_big(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
                m->m_flags |= M_FLOWID;
        }
 #endif
-       ether_input_chain(ifp, m, NULL, chain);
+       ifp->if_input(ifp, m);
 }
 
 static inline void
-mxge_rx_done_small(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
-                  struct mbuf_chain *chain)
+mxge_rx_done_small(struct mxge_slice_state *ss, uint32_t len, uint32_t csum)
 {
        mxge_softc_t *sc;
        struct ifnet *ifp;
@@ -2665,7 +2663,7 @@ mxge_rx_done_small(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
                m->m_flags |= M_FLOWID;
        }
 #endif
-       ether_input_chain(ifp, m, NULL, chain);
+       ifp->if_input(ifp, m);
 }
 
 /*
@@ -2683,17 +2681,15 @@ mxge_clean_rx_done(struct mxge_slice_state *ss)
        int limit = 0;
        uint16_t length;
        uint16_t checksum;
-       struct mbuf_chain chain[MAXCPU];
 
-       ether_input_chain_init(chain);
        while (rx_done->entry[rx_done->idx].length != 0) {
                length = ntohs(rx_done->entry[rx_done->idx].length);
                rx_done->entry[rx_done->idx].length = 0;
                checksum = rx_done->entry[rx_done->idx].checksum;
                if (length <= (MHLEN - MXGEFW_PAD))
-                       mxge_rx_done_small(ss, length, checksum, chain);
+                       mxge_rx_done_small(ss, length, checksum);
                else
-                       mxge_rx_done_big(ss, length, checksum, chain);
+                       mxge_rx_done_big(ss, length, checksum);
                rx_done->cnt++;
                rx_done->idx = rx_done->cnt & rx_done->mask;
 
@@ -2701,7 +2697,6 @@ mxge_clean_rx_done(struct mxge_slice_state *ss)
                if (__predict_false(++limit > rx_done->mask / 2))
                        break;
        }
-       ether_input_dispatch(chain);
 #ifdef INET
        while (!SLIST_EMPTY(&ss->lro_active)) {
                struct lro_entry *lro = SLIST_FIRST(&ss->lro_active);
index 882832f..4137b27 100644 (file)
@@ -1052,11 +1052,8 @@ nfe_rxeof(struct nfe_softc *sc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct nfe_rx_ring *ring = &sc->rxq;
        int reap;
-       struct mbuf_chain chain[MAXCPU];
 
        reap = 0;
-       ether_input_chain_init(chain);
-
        for (;;) {
                struct nfe_rx_data *data = &ring->data[ring->cur];
                struct mbuf *m;
@@ -1135,14 +1132,11 @@ nfe_rxeof(struct nfe_softc *sc)
                }
 
                ifp->if_ipackets++;
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
 skip:
                nfe_set_ready_rxdesc(sc, ring, ring->cur);
                sc->rxq.cur = (sc->rxq.cur + 1) % sc->sc_rx_ring_count;
        }
-
-       if (reap)
-               ether_input_dispatch(chain);
        return reap;
 }
 
index 34d7b9a..3f17031 100644 (file)
@@ -1865,9 +1865,6 @@ re_rxeof(struct re_softc *sc)
        struct re_desc  *cur_rx;
        uint32_t rxstat, rxctrl;
        int i, total_len, rx = 0;
-       struct mbuf_chain chain[MAXCPU];
-
-       ether_input_chain_init(chain);
 
        for (i = sc->re_ldata.re_rx_prodidx;
             RE_OWN(&sc->re_ldata.re_rx_list[i]) == 0; RE_RXDESC_INC(sc, i)) {
@@ -2015,11 +2012,9 @@ re_rxeof(struct re_softc *sc)
                        m->m_pkthdr.ether_vlantag =
                                be16toh((rxctrl & RE_RDESC_CTL_TAGDATA));
                }
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
        }
 
-       ether_input_dispatch(chain);
-
        sc->re_ldata.re_rx_prodidx = i;
 
        return rx;
index c58decb..523834d 100644 (file)
@@ -1976,11 +1976,8 @@ xl_rxeof(struct xl_softc *sc, int count)
        struct xl_chain_onefrag *cur_rx;
        int                     total_len = 0;
        u_int32_t               rxstat;
-       struct mbuf_chain chain[MAXCPU];
 
        ifp = &sc->arpcom.ac_if;
-
-       ether_input_chain_init(chain);
 again:
        while((rxstat = le32toh(sc->xl_cdata.xl_rx_head->xl_ptr->xl_status))) {
 #ifdef DEVICE_POLLING
@@ -2062,7 +2059,7 @@ again:
                        }
                }
 
-               ether_input_chain(ifp, m, NULL, chain);
+               ifp->if_input(ifp, m);
        }
 
        if (sc->xl_type != XL_TYPE_905B) {
@@ -2089,8 +2086,6 @@ again:
                        goto again;
                }
        }
-
-       ether_input_dispatch(chain);
 }
 
 /*
index 0bd6b78..5cca9e4 100644 (file)
@@ -184,8 +184,8 @@ SYSCTL_ULONG(_net_link_ether, OID_AUTO, input_requeue, CTLFLAG_RW,
 #define KTR_ETHERNET           KTR_ALL
 #endif
 KTR_INFO_MASTER(ether);
-KTR_INFO(KTR_ETHERNET, ether, chain_beg, 0, ETHER_KTR_STR, ETHER_KTR_ARGS);
-KTR_INFO(KTR_ETHERNET, ether, chain_end, 1, ETHER_KTR_STR, ETHER_KTR_ARGS);
+KTR_INFO(KTR_ETHERNET, ether, pkt_beg, 0, ETHER_KTR_STR, ETHER_KTR_ARGS);
+KTR_INFO(KTR_ETHERNET, ether, pkt_end, 1, ETHER_KTR_STR, ETHER_KTR_ARGS);
 KTR_INFO(KTR_ETHERNET, ether, disp_beg, 2, ETHER_KTR_STR, ETHER_KTR_ARGS);
 KTR_INFO(KTR_ETHERNET, ether, disp_end, 3, ETHER_KTR_STR, ETHER_KTR_ARGS);
 #define logether(name, arg)    KTR_LOG(ether_ ## name, arg)
@@ -545,7 +545,7 @@ ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst, struct ip_fw **rule,
 static void
 ether_input(struct ifnet *ifp, struct mbuf *m)
 {
-       ether_input_chain(ifp, m, NULL, NULL);
+       ether_input_pkt(ifp, m, NULL);
 }
 
 /*
@@ -931,55 +931,6 @@ ether_restore_header(struct mbuf **m0, const struct ether_header *eh,
        *m0 = m;
 }
 
-static void
-ether_input_ipifunc(void *arg)
-{
-       struct mbuf *m, *next;
-       lwkt_port_t port = cpu_portfn(mycpu->gd_cpuid);
-
-       m = arg;
-       do {
-               next = m->m_nextpkt;
-               m->m_nextpkt = NULL;
-               lwkt_sendmsg(port, &m->m_hdr.mh_netmsg.base.lmsg);
-               m = next;
-       } while (m != NULL);
-}
-
-void
-ether_input_dispatch(struct mbuf_chain *chain)
-{
-#ifdef SMP
-       int i;
-
-       logether(disp_beg, NULL);
-       for (i = 0; i < ncpus; ++i) {
-               if (chain[i].mc_head != NULL) {
-                       lwkt_send_ipiq(globaldata_find(i),
-                                      ether_input_ipifunc, chain[i].mc_head);
-               }
-       }
-#else
-       logether(disp_beg, NULL);
-       if (chain->mc_head != NULL)
-               ether_input_ipifunc(chain->mc_head);
-#endif
-       logether(disp_end, NULL);
-}
-
-void
-ether_input_chain_init(struct mbuf_chain *chain)
-{
-#ifdef SMP
-       int i;
-
-       for (i = 0; i < ncpus; ++i)
-               chain[i].mc_head = chain[i].mc_tail = NULL;
-#else
-       chain->mc_head = chain->mc_tail = NULL;
-#endif
-}
-
 /*
  * Upper layer processing for a received Ethernet packet.
  */
@@ -1154,7 +1105,7 @@ post_stats:
 #ifdef MPLS
        case ETHERTYPE_MPLS:
        case ETHERTYPE_MPLS_MCAST:
-               /* Should have been set by ether_input_chain(). */
+               /* Should have been set by ether_input_pkt(). */
                KKASSERT(m->m_flags & M_MPLSLABELED);
                isr = NETISR_MPLS;
                break;
@@ -1298,7 +1249,7 @@ ether_input_oncpu(struct ifnet *ifp, struct mbuf *m)
 }
 
 /*
- * Perform certain functions of ether_input_chain():
+ * Perform certain functions of ether_input_pkt():
  * - Test IFF_UP
  * - Update statistics
  * - Run bpf(4) tap if requested
@@ -1416,13 +1367,13 @@ ether_input_handler(netmsg_t nmsg)
 }
 
 /*
- * Send the packet to the target msgport or queue it into 'chain'.
+ * Send the packet to the target msgport
  *
  * At this point the packet had better be characterized (M_HASH set),
  * so we know which cpu to send it to.
  */
 static void
-ether_dispatch(int isr, struct mbuf *m, struct mbuf_chain *chain)
+ether_dispatch(int isr, struct mbuf *m)
 {
        struct netmsg_packet *pmsg;
 
@@ -1433,21 +1384,9 @@ ether_dispatch(int isr, struct mbuf *m, struct mbuf_chain *chain)
        pmsg->nm_packet = m;
        pmsg->base.lmsg.u.ms_result = isr;
 
-       if (chain != NULL) {
-               int cpuid = m->m_pkthdr.hash;
-               struct mbuf_chain *c;
-
-               c = &chain[cpuid];
-               if (c->mc_head == NULL) {
-                       c->mc_head = c->mc_tail = m;
-               } else {
-                       c->mc_tail->m_nextpkt = m;
-                       c->mc_tail = m;
-               }
-               m->m_nextpkt = NULL;
-       } else {
-               lwkt_sendmsg(cpu_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
-       }
+       logether(disp_beg, NULL);
+       lwkt_sendmsg(cpu_portfn(m->m_pkthdr.hash), &pmsg->base.lmsg);
+       logether(disp_end, NULL);
 }
 
 /*
@@ -1456,21 +1395,9 @@ ether_dispatch(int isr, struct mbuf *m, struct mbuf_chain *chain)
  * The ethernet header is assumed to be in the mbuf so the caller
  * MUST MAKE SURE that there are at least sizeof(struct ether_header)
  * bytes in the first mbuf.
- *
- * - If 'chain' is NULL, this ether frame is sent to the target msgport
- *   immediately.  This situation happens when ether_input_chain is
- *   accessed through ifnet.if_input.
- *
- * - If 'chain' is not NULL, this ether frame is queued to the 'chain'
- *   bucket indexed by the target msgport's cpuid and the target msgport
- *   is saved in mbuf's m_pkthdr.m_head.  Caller of ether_input_chain
- *   must initialize 'chain' by calling ether_input_chain_init().
- *   ether_input_dispatch must be called later to send ether frames
- *   queued on 'chain' to their target msgport.
  */
 void
-ether_input_chain(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi,
-                 struct mbuf_chain *chain)
+ether_input_pkt(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi)
 {
        int isr;
 
@@ -1490,7 +1417,7 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi,
 
        m->m_pkthdr.rcvif = ifp;
 
-       logether(chain_beg, ifp);
+       logether(pkt_beg, ifp);
 
        ETHER_BPF_MTAP(ifp, m);
 
@@ -1508,7 +1435,7 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi,
                 */
                m_freem(m);
 
-               logether(chain_end, ifp);
+               logether(pkt_end, ifp);
                return;
        }
 
@@ -1522,11 +1449,11 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi,
 #endif
                netisr_hashcheck(pi->pi_netisr, m, pi);
                if (m->m_flags & M_HASH) {
-                       ether_dispatch(pi->pi_netisr, m, chain);
+                       ether_dispatch(pi->pi_netisr, m);
 #ifdef RSS_DEBUG
                        ether_pktinfo_hit++;
 #endif
-                       logether(chain_end, ifp);
+                       logether(pkt_end, ifp);
                        return;
                }
        }
@@ -1549,22 +1476,22 @@ ether_input_chain(struct ifnet *ifp, struct mbuf *m, const struct pktinfo *pi,
 
        if (!ether_vlancheck(&m)) {
                KKASSERT(m == NULL);
-               logether(chain_end, ifp);
+               logether(pkt_end, ifp);
                return;
        }
 
        isr = ether_characterize(&m);
        if (m == NULL) {
-               logether(chain_end, ifp);
+               logether(pkt_end, ifp);
                return;
        }
 
        /*
         * Finally dispatch it
         */
-       ether_dispatch(isr, m, chain);
+       ether_dispatch(isr, m);
 
-       logether(chain_end, ifp);
+       logether(pkt_end, ifp);
 }
 
 static int
index 8eed43f..db37914 100644 (file)
@@ -79,7 +79,6 @@
  * Forward structure declarations for function prototypes [sic].
  */
 struct mbuf;
-struct mbuf_chain;
 struct proc;
 struct rtentry;
 struct rt_addrinfo;
@@ -738,10 +737,7 @@ void       ether_ifdetach(struct ifnet *);
 void   ether_demux(struct mbuf *);
 void   ether_demux_oncpu(struct ifnet *, struct mbuf *);
 void   ether_reinput_oncpu(struct ifnet *, struct mbuf *, int);
-void   ether_input_chain(struct ifnet *, struct mbuf *,
-                         const struct pktinfo *, struct mbuf_chain *);
-void   ether_input_chain_init(struct mbuf_chain *);
-void   ether_input_dispatch(struct mbuf_chain *);
+void   ether_input_pkt(struct ifnet *, struct mbuf *, const struct pktinfo *);
 int    ether_output_frame(struct ifnet *, struct mbuf *);
 int    ether_ioctl(struct ifnet *, u_long, caddr_t);
 struct ifnet *ether_bridge_interface(struct ifnet *ifp);
index bf5f1fe..2c7548e 100644 (file)
@@ -132,7 +132,7 @@ void netmsg_so_notify_doabort(lwkt_msg_t);
 
 /*
  * Temporary pktinfo structure passed directly from the driver to
- * ether_input_chain(), allows us to bypass numerous checks.
+ * ether_input_pkt(), allows us to bypass numerous checks.
  */
 struct pktinfo {
        int             pi_netisr;      /* netisr index, e.g. NETISR_IP */
index e38d4fe..2d5f8fb 100644 (file)
@@ -309,11 +309,6 @@ struct mbuf {
 #define        MT_OOBDATA      6       /* expedited data  */
 #define        MT_NTYPES       7       /* number of mbuf types for mbtypes[] */
 
-struct mbuf_chain {
-       struct mbuf     *mc_head;
-       struct mbuf     *mc_tail;
-};
-
 /*
  * General mbuf allocator statistics structure.
  */