diff --git a/sys/arch/acorn32/podulebus/if_ie.c b/sys/arch/acorn32/podulebus/if_ie.c index 8bb02ec..50372c3 100644 --- a/sys/arch/acorn32/podulebus/if_ie.c +++ b/sys/arch/acorn32/podulebus/if_ie.c @@ -1282,7 +1282,7 @@ ie_read_frame(struct ie_softc *sc, int num) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } void diff --git a/sys/arch/amiga/dev/if_es.c b/sys/arch/amiga/dev/if_es.c index 8269a3b..5e7ca07 100644 --- a/sys/arch/amiga/dev/if_es.c +++ b/sys/arch/amiga/dev/if_es.c @@ -721,7 +721,7 @@ esrint(struct es_softc *sc) * the raw packet to bpf. */ bpf_mtap(ifp, top); - if_input(ifp, top); + if_percpuq_enqueue(ifp->if_percpuq, top); #ifdef ESDEBUG if (--sc->sc_smcbusy) { printf("%s: esintr busy on exit\n", device_xname(sc->sc_dev)); diff --git a/sys/arch/amiga/dev/if_qn.c b/sys/arch/amiga/dev/if_qn.c index 2150cd3..80dd6ce 100644 --- a/sys/arch/amiga/dev/if_qn.c +++ b/sys/arch/amiga/dev/if_qn.c @@ -585,7 +585,7 @@ qn_get_packet(struct qn_softc *sc, u_short len) /* Tap off BPF listeners */ bpf_mtap(ifp, head); - if_input(ifp, head); + if_percpuq_enqueue(ifp->if_percpuq, head); return; bad: diff --git a/sys/arch/arm/allwinner/awin_eth.c b/sys/arch/arm/allwinner/awin_eth.c index 536cb4d..d91eb18 100644 --- a/sys/arch/arm/allwinner/awin_eth.c +++ b/sys/arch/arm/allwinner/awin_eth.c @@ -422,7 +422,7 @@ awin_eth_if_input(struct awin_eth_softc *sc, struct mbuf *m) { struct ifnet * const ifp = &sc->sc_ec.ec_if; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } static void diff --git a/sys/arch/arm/at91/at91emac.c b/sys/arch/arm/at91/at91emac.c index 687b534..009ba71 100644 --- a/sys/arch/arm/at91/at91emac.c +++ b/sys/arch/arm/at91/at91emac.c @@ -284,7 +284,7 @@ emac_intr(void *arg) sc->rxq[bi].m->m_len = fl; bpf_mtap(ifp, sc->rxq[bi].m); DPRINTFN(2,("received %u bytes packet\n", fl)); - if_input(ifp, sc->rxq[bi].m); + if_percpuq_enqueue(ifp->if_percpuq, sc->rxq[bi].m); if (mtod(m, intptr_t) & 3) { m_adj(m, mtod(m, intptr_t) & 3); } diff --git a/sys/arch/arm/ep93xx/epe.c b/sys/arch/arm/ep93xx/epe.c index 3072ada..fe38c1e 100644 --- a/sys/arch/arm/ep93xx/epe.c +++ b/sys/arch/arm/ep93xx/epe.c @@ -231,7 +231,8 @@ begin: sc->rxq[bi].m->m_pkthdr.len = sc->rxq[bi].m->m_len = fl; bpf_mtap(ifp, sc->rxq[bi].m); - if_input(ifp, sc->rxq[bi].m); + if_percpuq_enqueue(ifp->if_percpuq, + sc->rxq[bi].m); sc->rxq[bi].m = m; bus_dmamap_load(sc->sc_dmat, sc->rxq[bi].m_dmamap, diff --git a/sys/arch/arm/gemini/if_gpn.c b/sys/arch/arm/gemini/if_gpn.c index a08352d..4102b71 100644 --- a/sys/arch/arm/gemini/if_gpn.c +++ b/sys/arch/arm/gemini/if_gpn.c @@ -307,7 +307,7 @@ gpn_process_data(struct gpn_softc *sc, const ipm_gpn_desc_t *gd) printf("%s: rx len=%d crc=%#x\n", ifp->if_xname, m->m_pkthdr.len, m_crc32_le(m)); #endif - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } out: diff --git a/sys/arch/arm/imx/if_enet.c b/sys/arch/arm/imx/if_enet.c index 1e52e3a..46b8436 100644 --- a/sys/arch/arm/imx/if_enet.c +++ b/sys/arch/arm/imx/if_enet.c @@ -755,7 +755,7 @@ enet_rx_intr(void *arg) /* Pass this up to any BPF listeners */ bpf_mtap(ifp, m0); - if_input(ifp, m0); + if_percpuq_enqueue(ifp->if_percpuq, m0); } m0 = NULL; diff --git a/sys/arch/arm/omap/if_cpsw.c b/sys/arch/arm/omap/if_cpsw.c index 2287ebc..8974bd3 100644 --- a/sys/arch/arm/omap/if_cpsw.c +++ b/sys/arch/arm/omap/if_cpsw.c @@ -1170,7 +1170,7 @@ cpsw_rxintr(void *arg) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); next: sc->sc_rxhead = RXDESC_NEXT(sc->sc_rxhead); diff --git a/sys/arch/arm/omap/omapl1x_emac.c b/sys/arch/arm/omap/omapl1x_emac.c index 4a23332..21e6d55 100644 --- a/sys/arch/arm/omap/omapl1x_emac.c +++ b/sys/arch/arm/omap/omapl1x_emac.c @@ -658,7 +658,7 @@ emac_rx_desc_process (struct emac_softc *sc, struct emac_channel *chan) ifp->if_ipackets++; bpf_mtap(ifp, mb); - if_input(ifp, mb); + if_percpuq_enqueue(ifp->if_percpuq, mb); entry->m = NULL; diff --git a/sys/arch/arm/rockchip/rockchip_emac.c b/sys/arch/arm/rockchip/rockchip_emac.c index cffa42f..d264728 100644 --- a/sys/arch/arm/rockchip/rockchip_emac.c +++ b/sys/arch/arm/rockchip/rockchip_emac.c @@ -879,7 +879,7 @@ rkemac_rxintr(struct rkemac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); skip: bus_dmamap_sync(sc->sc_dmat, rd->rd_map, 0, diff --git a/sys/arch/arm/xscale/ixp425_if_npe.c b/sys/arch/arm/xscale/ixp425_if_npe.c index 84a0b71..9e61d7c 100644 --- a/sys/arch/arm/xscale/ixp425_if_npe.c +++ b/sys/arch/arm/xscale/ixp425_if_npe.c @@ -1055,7 +1055,7 @@ npe_rxdone(int qid, void *arg) * Tap off here if there is a bpf listener. */ bpf_mtap(ifp, mrx); - if_input(ifp, mrx); + if_percpuq_enqueue(ifp->if_percpuq, mrx); } else { fail: /* discard frame and re-use mbuf */ diff --git a/sys/arch/emips/ebus/if_le_ebus.c b/sys/arch/emips/ebus/if_le_ebus.c index 947bdb0..1087944 100644 --- a/sys/arch/emips/ebus/if_le_ebus.c +++ b/sys/arch/emips/ebus/if_le_ebus.c @@ -768,7 +768,7 @@ enic_rint(struct enic_softc *sc, uint32_t saf, paddr_t phys) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* Need to refill now */ enic_refill(sc); diff --git a/sys/arch/evbppc/virtex/dev/if_temac.c b/sys/arch/evbppc/virtex/dev/if_temac.c index b61dae5..3e63e49 100644 --- a/sys/arch/evbppc/virtex/dev/if_temac.c +++ b/sys/arch/evbppc/virtex/dev/if_temac.c @@ -1211,7 +1211,7 @@ temac_rxreap(struct temac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* Refresh descriptor, bail out if we're out of buffers. */ if (temac_rxalloc(sc, tail, 1) != 0) { diff --git a/sys/arch/mac68k/dev/if_mc.c b/sys/arch/mac68k/dev/if_mc.c index 240308a..cf71a8a 100644 --- a/sys/arch/mac68k/dev/if_mc.c +++ b/sys/arch/mac68k/dev/if_mc.c @@ -585,7 +585,7 @@ mace_read(struct mc_softc *sc, void *pkt, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/arch/mac68k/nubus/if_netdock_nubus.c b/sys/arch/mac68k/nubus/if_netdock_nubus.c index f409666..7eb6530 100644 --- a/sys/arch/mac68k/nubus/if_netdock_nubus.c +++ b/sys/arch/mac68k/nubus/if_netdock_nubus.c @@ -766,7 +766,7 @@ netdock_read(struct netdock_softc *sc, int len) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); return (1); } diff --git a/sys/arch/macppc/dev/am79c950.c b/sys/arch/macppc/dev/am79c950.c index cc24c3d..d2503f2 100644 --- a/sys/arch/macppc/dev/am79c950.c +++ b/sys/arch/macppc/dev/am79c950.c @@ -597,7 +597,7 @@ mace_read(struct mc_softc *sc, uint8_t *pkt, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/arch/macppc/dev/if_bm.c b/sys/arch/macppc/dev/if_bm.c index b915695..15c4cba 100644 --- a/sys/arch/macppc/dev/if_bm.c +++ b/sys/arch/macppc/dev/if_bm.c @@ -502,7 +502,7 @@ bmac_rint(void *v) * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; next: diff --git a/sys/arch/macppc/dev/if_gm.c b/sys/arch/macppc/dev/if_gm.c index 2701f6c..4505bb2 100644 --- a/sys/arch/macppc/dev/if_gm.c +++ b/sys/arch/macppc/dev/if_gm.c @@ -382,7 +382,7 @@ gmac_rint(struct gmac_softc *sc) * If so, hand off the raw packet to BPF. */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; next: diff --git a/sys/arch/mips/adm5120/dev/if_admsw.c b/sys/arch/mips/adm5120/dev/if_admsw.c index df46260..e6cc531 100644 --- a/sys/arch/mips/adm5120/dev/if_admsw.c +++ b/sys/arch/mips/adm5120/dev/if_admsw.c @@ -1002,7 +1002,7 @@ admsw_rxintr(struct admsw_softc *sc, int high) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; } #ifdef ADMSW_EVENT_COUNTERS diff --git a/sys/arch/mips/alchemy/dev/if_aumac.c b/sys/arch/mips/alchemy/dev/if_aumac.c index cc6b123..4483b42 100644 --- a/sys/arch/mips/alchemy/dev/if_aumac.c +++ b/sys/arch/mips/alchemy/dev/if_aumac.c @@ -719,7 +719,7 @@ aumac_rxintr(struct aumac_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; } if (pkts) diff --git a/sys/arch/mips/atheros/dev/if_ae.c b/sys/arch/mips/atheros/dev/if_ae.c index 3e02216..c7ecc83 100644 --- a/sys/arch/mips/atheros/dev/if_ae.c +++ b/sys/arch/mips/atheros/dev/if_ae.c @@ -1139,7 +1139,7 @@ ae_rxintr(struct ae_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/arch/mips/cavium/dev/if_cnmac.c b/sys/arch/mips/cavium/dev/if_cnmac.c index c7824e3..50e1fa1 100644 --- a/sys/arch/mips/cavium/dev/if_cnmac.c +++ b/sys/arch/mips/cavium/dev/if_cnmac.c @@ -1489,7 +1489,7 @@ octeon_eth_recv(struct octeon_eth_softc *sc, uint64_t *work) octeon_eth_send_queue_flush_sync(sc); /* XXX XXX XXX */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); return 0; @@ -1826,7 +1826,7 @@ octeon_eth_sysctl_verify(SYSCTLFN_ARGS) octeon_eth_mii_statchg(ifp); /* octeon_gmx_set_filter(sc->sc_gmx_port); */ } - if_input= ether_input; + ifp->_if_input = ether_input; } else { if (!ISSET(ifp->if_flags, IFF_PROMISC)) { @@ -1834,7 +1834,7 @@ octeon_eth_sysctl_verify(SYSCTLFN_ARGS) octeon_eth_mii_statchg(ifp); /* octeon_gmx_set_filter(sc->sc_gmx_port); */ } - if_input= octeon_eth_recv_redir; + ifp->_if_input = octeon_eth_recv_redir; } } splx(s); diff --git a/sys/arch/mips/ralink/ralink_eth.c b/sys/arch/mips/ralink/ralink_eth.c index 245e571..473b20a 100644 --- a/sys/arch/mips/ralink/ralink_eth.c +++ b/sys/arch/mips/ralink/ralink_eth.c @@ -1490,7 +1490,7 @@ ralink_eth_rxintr(ralink_eth_softc_t *sc) /* Pass it on. */ sc->sc_evcnt_input.ev_count++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); fe_write(sc, RA_FE_PDMA_RX0_CPU_IDX, rx_cpu_idx); } diff --git a/sys/arch/mips/sibyte/dev/sbmac.c b/sys/arch/mips/sibyte/dev/sbmac.c index 4ce905c..0767f20 100644 --- a/sys/arch/mips/sibyte/dev/sbmac.c +++ b/sys/arch/mips/sibyte/dev/sbmac.c @@ -938,7 +938,7 @@ sbdma_rx_process(struct sbmac_softc *sc, sbmacdma_t *d) /* * Pass the buffer to the kernel */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } else { /* * Packet was mangled somehow. Just drop it and diff --git a/sys/arch/newsmips/apbus/if_sn.c b/sys/arch/newsmips/apbus/if_sn.c index 2f9ee54..e73cd50 100644 --- a/sys/arch/newsmips/apbus/if_sn.c +++ b/sys/arch/newsmips/apbus/if_sn.c @@ -1059,7 +1059,7 @@ sonic_read(struct sn_softc *sc, void *pkt, int len) return 0; /* Pass the packet to any BPF listeners. */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); return 1; } diff --git a/sys/arch/next68k/dev/mb8795.c b/sys/arch/next68k/dev/mb8795.c index a2c54d3..ad66fca 100644 --- a/sys/arch/next68k/dev/mb8795.c +++ b/sys/arch/next68k/dev/mb8795.c @@ -328,7 +328,7 @@ mb8795_rint(struct mb8795_softc *sc) ifp->if_ipackets++; /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); s = spldma(); diff --git a/sys/arch/playstation2/dev/if_smap.c b/sys/arch/playstation2/dev/if_smap.c index 0bf16bb..a610b37 100644 --- a/sys/arch/playstation2/dev/if_smap.c +++ b/sys/arch/playstation2/dev/if_smap.c @@ -410,7 +410,7 @@ smap_rxeof(void *arg) if (m != NULL) { if (ifp->if_bpf) bpf_mtap(ifp->if_bpf, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } sc->rx_done_index = i; diff --git a/sys/arch/powerpc/ibm4xx/dev/if_emac.c b/sys/arch/powerpc/ibm4xx/dev/if_emac.c index 5df1ab2..2ffb355 100644 --- a/sys/arch/powerpc/ibm4xx/dev/if_emac.c +++ b/sys/arch/powerpc/ibm4xx/dev/if_emac.c @@ -1676,7 +1676,7 @@ emac_rxeob_intr(void *arg) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/arch/sgimips/hpc/if_sq.c b/sys/arch/sgimips/hpc/if_sq.c index 080e816..52bbd17 100644 --- a/sys/arch/sgimips/hpc/if_sq.c +++ b/sys/arch/sgimips/hpc/if_sq.c @@ -1022,7 +1022,7 @@ sq_rxintr(struct sq_softc *sc) device_xname(sc->sc_dev), i, framelen)); bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } diff --git a/sys/arch/sgimips/mace/if_mec.c b/sys/arch/sgimips/mace/if_mec.c index 4064785..992fcaf 100644 --- a/sys/arch/sgimips/mace/if_mec.c +++ b/sys/arch/sgimips/mace/if_mec.c @@ -1739,7 +1739,7 @@ mec_rxintr(struct mec_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* update RX pointer */ diff --git a/sys/arch/sun2/dev/if_ec.c b/sys/arch/sun2/dev/if_ec.c index 6017c64..b0269cc 100644 --- a/sys/arch/sun2/dev/if_ec.c +++ b/sys/arch/sun2/dev/if_ec.c @@ -532,7 +532,7 @@ ec_recv(struct ec_softc *sc, int intbit) bpf_mtap(ifp, m0); /* Pass the packet up. */ - if_input(ifp, m0); + if_percpuq_enqueue(ifp->if_percpuq, m0); } else { /* Something went wrong. */ diff --git a/sys/arch/sun3/dev/if_ie.c b/sys/arch/sun3/dev/if_ie.c index ea8c67e..19d2824 100644 --- a/sys/arch/sun3/dev/if_ie.c +++ b/sys/arch/sun3/dev/if_ie.c @@ -996,7 +996,7 @@ ie_readframe(struct ie_softc *sc, int num) /* * Finally pass this packet up to higher layers. */ - if_input(&sc->sc_if, m); + if_percpuq_enqueue((&sc->sc_if)->if_percpuq, m); sc->sc_if.if_ipackets++; } diff --git a/sys/arch/x86/pci/if_vmx.c b/sys/arch/x86/pci/if_vmx.c index 850b62f9..71ef30d 100644 --- a/sys/arch/x86/pci/if_vmx.c +++ b/sys/arch/x86/pci/if_vmx.c @@ -767,7 +767,7 @@ vmxnet3_rxintr(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rq) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); skip_buffer: #ifdef VMXNET3_STAT diff --git a/sys/arch/xen/xen/if_xennet_xenbus.c b/sys/arch/xen/xen/if_xennet_xenbus.c index b7daca8..d16f946 100644 --- a/sys/arch/xen/xen/if_xennet_xenbus.c +++ b/sys/arch/xen/xen/if_xennet_xenbus.c @@ -1107,7 +1107,7 @@ again: ifp->if_ipackets++; /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } xen_rmb(); sc->sc_rx_ring.rsp_cons = i; diff --git a/sys/arch/xen/xen/xennetback_xenbus.c b/sys/arch/xen/xen/xennetback_xenbus.c index 0885d2c..405437f 100644 --- a/sys/arch/xen/xen/xennetback_xenbus.c +++ b/sys/arch/xen/xen/xennetback_xenbus.c @@ -891,7 +891,7 @@ so always copy for now. ifp->if_ipackets++; bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } xen_rmb(); /* be sure to read the request before updating pointer */ xneti->xni_txring.req_cons = req_cons; diff --git a/sys/dev/bi/if_ni.c b/sys/dev/bi/if_ni.c index 2836b68..27f0579 100644 --- a/sys/dev/bi/if_ni.c +++ b/sys/dev/bi/if_ni.c @@ -618,7 +618,7 @@ niintr(void *arg) break; /* Out of mbufs */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); break; case BVP_DGRAM: diff --git a/sys/dev/cadence/if_cemac.c b/sys/dev/cadence/if_cemac.c index 13e27a2..e1e3b1d 100644 --- a/sys/dev/cadence/if_cemac.c +++ b/sys/dev/cadence/if_cemac.c @@ -358,7 +358,8 @@ cemac_intr(void *arg) sc->rxq[bi].m->m_pkthdr.csum_flags = csum; bpf_mtap(ifp, sc->rxq[bi].m); DPRINTFN(2,("received %u bytes packet\n", fl)); - if_input(ifp, sc->rxq[bi].m); + if_percpuq_enqueue(ifp->if_percpuq, + sc->rxq[bi].m); if (mtod(m, intptr_t) & 3) m_adj(m, mtod(m, intptr_t) & 3); sc->rxq[bi].m = m; diff --git a/sys/dev/ic/aic6915.c b/sys/dev/ic/aic6915.c index 0cc2152..4c6f204 100644 --- a/sys/dev/ic/aic6915.c +++ b/sys/dev/ic/aic6915.c @@ -791,7 +791,7 @@ sf_rxintr(struct sf_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the chip's pointers. */ diff --git a/sys/dev/ic/cs89x0.c b/sys/dev/ic/cs89x0.c index 4a74b19..0a4087f 100644 --- a/sys/dev/ic/cs89x0.c +++ b/sys/dev/ic/cs89x0.c @@ -1665,7 +1665,7 @@ cs_ether_input(struct cs_softc *sc, struct mbuf *m) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } void diff --git a/sys/dev/ic/dm9000.c b/sys/dev/ic/dm9000.c index b688d4b..258e0b6 100644 --- a/sys/dev/ic/dm9000.c +++ b/sys/dev/ic/dm9000.c @@ -827,7 +827,7 @@ dme_receive(struct dme_softc *sc, struct ifnet *ifp) if (ifp->if_bpf) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } else if (ready != 0x00) { diff --git a/sys/dev/ic/dp8390.c b/sys/dev/ic/dp8390.c index 9ac92a2..796d8a3 100644 --- a/sys/dev/ic/dp8390.c +++ b/sys/dev/ic/dp8390.c @@ -947,7 +947,7 @@ dp8390_read(struct dp8390_softc *sc, int buf, u_short len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } diff --git a/sys/dev/ic/dp83932.c b/sys/dev/ic/dp83932.c index f511869..a5ea524 100644 --- a/sys/dev/ic/dp83932.c +++ b/sys/dev/ic/dp83932.c @@ -843,7 +843,7 @@ sonic_rxintr(struct sonic_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/ic/dwc_gmac.c b/sys/dev/ic/dwc_gmac.c index 358ecc7..87a441b 100644 --- a/sys/dev/ic/dwc_gmac.c +++ b/sys/dev/ic/dwc_gmac.c @@ -1127,7 +1127,7 @@ dwc_gmac_rx_intr(struct dwc_gmac_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); skip: bus_dmamap_sync(sc->sc_dmat, data->rd_map, 0, diff --git a/sys/dev/ic/elink3.c b/sys/dev/ic/elink3.c index ea14a4a..d820f07 100644 --- a/sys/dev/ic/elink3.c +++ b/sys/dev/ic/elink3.c @@ -1496,7 +1496,7 @@ again: */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* * In periods of high traffic we can actually receive enough diff --git a/sys/dev/ic/elinkxl.c b/sys/dev/ic/elinkxl.c index 7130201..845a92b 100644 --- a/sys/dev/ic/elinkxl.c +++ b/sys/dev/ic/elinkxl.c @@ -1393,7 +1393,7 @@ ex_intr(void *arg) M_CSUM_TCP_UDP_BAD; } } - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } goto rcvloop; } diff --git a/sys/dev/ic/gem.c b/sys/dev/ic/gem.c index 423a3a4..4588b17 100644 --- a/sys/dev/ic/gem.c +++ b/sys/dev/ic/gem.c @@ -1940,7 +1940,7 @@ swcsum: m->m_pkthdr.csum_flags = 0; #endif /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } if (progress) { diff --git a/sys/dev/ic/hme.c b/sys/dev/ic/hme.c index 6ba8fe0..73c1715 100644 --- a/sys/dev/ic/hme.c +++ b/sys/dev/ic/hme.c @@ -885,7 +885,7 @@ hme_read(struct hme_softc *sc, int ix, uint32_t flags) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } void diff --git a/sys/dev/ic/i82557.c b/sys/dev/ic/i82557.c index ba110b3..0bbc11f 100644 --- a/sys/dev/ic/i82557.c +++ b/sys/dev/ic/i82557.c @@ -1458,7 +1458,7 @@ fxp_rxintr(struct fxp_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/ic/i82586.c b/sys/dev/ic/i82586.c index cb1252f..a6c2142 100644 --- a/sys/dev/ic/i82586.c +++ b/sys/dev/ic/i82586.c @@ -1039,7 +1039,7 @@ ie_readframe( /* * Finally pass this packet up to higher layers. */ - if_input(&sc->sc_ethercom.ec_if, m); + if_percpuq_enqueue((&sc->sc_ethercom.ec_if)->if_percpuq, m); sc->sc_ethercom.ec_if.if_ipackets++; return (0); } diff --git a/sys/dev/ic/i82596.c b/sys/dev/ic/i82596.c index 776ecb2..660fcb4 100644 --- a/sys/dev/ic/i82596.c +++ b/sys/dev/ic/i82596.c @@ -281,7 +281,7 @@ iee_intr(void *intarg) bus_dmamap_sync(sc->sc_dmat, rx_map, 0, rx_map->dm_mapsize, BUS_DMASYNC_PREREAD); bpf_mtap(ifp, rx_mbuf); - if_input(ifp, rx_mbuf); + if_percpuq_enqueue(ifp->if_percpuq, rx_mbuf); ifp->if_ipackets++; sc->sc_rx_mbuf[sc->sc_rx_done] = new_mbuf; rbd->rbd_count = 0; diff --git a/sys/dev/ic/lan9118.c b/sys/dev/ic/lan9118.c index 4ca065c..2fdce65 100644 --- a/sys/dev/ic/lan9118.c +++ b/sys/dev/ic/lan9118.c @@ -1002,7 +1002,7 @@ dropit: bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/ic/lance.c b/sys/dev/ic/lance.c index 2bb24c1..e6d9a8f 100644 --- a/sys/dev/ic/lance.c +++ b/sys/dev/ic/lance.c @@ -479,7 +479,7 @@ lance_read(struct lance_softc *sc, int boff, int len) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } #undef ifp diff --git a/sys/dev/ic/lemac.c b/sys/dev/ic/lemac.c index 7a49291..85b5c1b 100644 --- a/sys/dev/ic/lemac.c +++ b/sys/dev/ic/lemac.c @@ -317,7 +317,7 @@ lemac_input( } m->m_pkthdr.len = m->m_len = length; m->m_pkthdr.rcvif = &sc->sc_if; - if_input(&sc->sc_if, m); + if_percpuq_enqueue((&sc->sc_if)->if_percpuq, m); } static void diff --git a/sys/dev/ic/mb86950.c b/sys/dev/ic/mb86950.c index 8765142..092ed20 100644 --- a/sys/dev/ic/mb86950.c +++ b/sys/dev/ic/mb86950.c @@ -908,7 +908,7 @@ mb86950_get_fifo(struct mb86950_softc *sc, u_int len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); return (0); } diff --git a/sys/dev/ic/mb86960.c b/sys/dev/ic/mb86960.c index 0aaaef6..ca6cd1d 100644 --- a/sys/dev/ic/mb86960.c +++ b/sys/dev/ic/mb86960.c @@ -1336,7 +1336,7 @@ mb86960_get_packet(struct mb86960_softc *sc, u_int len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); return 1; } diff --git a/sys/dev/ic/mtd803.c b/sys/dev/ic/mtd803.c index 47491e8..0ecb3dfd 100644 --- a/sys/dev/ic/mtd803.c +++ b/sys/dev/ic/mtd803.c @@ -681,7 +681,7 @@ mtd_rxirq(struct mtd_softc *sc) bpf_mtap(ifp, m); /* Pass the packet up */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } return 1; diff --git a/sys/dev/ic/pdq_ifsubr.c b/sys/dev/ic/pdq_ifsubr.c index d0323a0..15b56b4 100644 --- a/sys/dev/ic/pdq_ifsubr.c +++ b/sys/dev/ic/pdq_ifsubr.c @@ -249,7 +249,7 @@ pdq_os_receive_pdu( } m->m_pkthdr.rcvif = &sc->sc_if; - if_input(&sc->sc_if, m); + if_percpuq_enqueue((&sc->sc_if)->if_percpuq, m); } void diff --git a/sys/dev/ic/rrunner.c b/sys/dev/ic/rrunner.c index ebcb728..84a245d 100644 --- a/sys/dev/ic/rrunner.c +++ b/sys/dev/ic/rrunner.c @@ -2377,7 +2377,7 @@ esh_read_snap_ring(struct esh_softc *sc, u_int16_t consumer, int error) } else { m = m_pullup(m, sizeof(struct hippi_header)); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } else { ifp->if_ierrors++; diff --git a/sys/dev/ic/rtl8169.c b/sys/dev/ic/rtl8169.c index 4af51a3..7efecfe 100644 --- a/sys/dev/ic/rtl8169.c +++ b/sys/dev/ic/rtl8169.c @@ -1358,7 +1358,7 @@ re_rxeof(struct rtk_softc *sc) continue); } bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } sc->re_ldata.re_rx_prodidx = i; diff --git a/sys/dev/ic/rtl81x9.c b/sys/dev/ic/rtl81x9.c index 7725298..ae01f6f 100644 --- a/sys/dev/ic/rtl81x9.c +++ b/sys/dev/ic/rtl81x9.c @@ -1077,7 +1077,7 @@ rtk_rxeof(struct rtk_softc *sc) bpf_mtap(ifp, m); /* pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/ic/seeq8005.c b/sys/dev/ic/seeq8005.c index a800cab..51d6194 100644 --- a/sys/dev/ic/seeq8005.c +++ b/sys/dev/ic/seeq8005.c @@ -1252,7 +1252,7 @@ ea_read(struct seeq8005_softc *sc, int addr, int len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/ic/sgec.c b/sys/dev/ic/sgec.c index 4c1fb9f..dd7dffb 100644 --- a/sys/dev/ic/sgec.c +++ b/sys/dev/ic/sgec.c @@ -466,7 +466,7 @@ sgec_intr(struct ze_softc *sc) m->m_pkthdr.len = m->m_len = len - ETHER_CRC_LEN; bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } } diff --git a/sys/dev/ic/smc83c170.c b/sys/dev/ic/smc83c170.c index 71a04c3..37bccfc 100644 --- a/sys/dev/ic/smc83c170.c +++ b/sys/dev/ic/smc83c170.c @@ -714,7 +714,7 @@ epic_intr(void *arg) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; } diff --git a/sys/dev/ic/smc90cx6.c b/sys/dev/ic/smc90cx6.c index 5ed9121..3d0811b 100644 --- a/sys/dev/ic/smc90cx6.c +++ b/sys/dev/ic/smc90cx6.c @@ -598,7 +598,7 @@ bah_srint(void *vsc) bpf_mtap(ifp, head); - if_input(&sc->sc_arccom.ac_if, head); + if_percpuq_enqueue((&sc->sc_arccom.ac_if)->if_percpuq, head); head = NULL; ifp->if_ipackets++; diff --git a/sys/dev/ic/smc91cxx.c b/sys/dev/ic/smc91cxx.c index 4c0c0e2..54e4b32 100644 --- a/sys/dev/ic/smc91cxx.c +++ b/sys/dev/ic/smc91cxx.c @@ -1243,7 +1243,7 @@ smc91cxx_read(struct smc91cxx_softc *sc) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); out: /* diff --git a/sys/dev/ic/tropic.c b/sys/dev/ic/tropic.c index 55570ad..8b665d7 100644 --- a/sys/dev/ic/tropic.c +++ b/sys/dev/ic/tropic.c @@ -1251,7 +1251,7 @@ tr_rint(struct tr_softc *sc) ++ifp->if_ipackets; bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/ic/tulip.c b/sys/dev/ic/tulip.c index a3543ed..0f78c1e 100644 --- a/sys/dev/ic/tulip.c +++ b/sys/dev/ic/tulip.c @@ -1397,7 +1397,7 @@ tlp_rxintr(struct tulip_softc *sc) } /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 1a3be07..27d5c07 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -1048,7 +1048,7 @@ ndis_rxeof(ndis_handle adapter, ndis_packet **packets, uint32_t pktcnt) bpf_mtap(ifp, m0); - if_input(ifp, m0); + if_percpuq_enqueue(ifp->if_percpuq, m0); } } diff --git a/sys/dev/isa/if_eg.c b/sys/dev/isa/if_eg.c index c6a1d17..a4c6c85 100644 --- a/sys/dev/isa/if_eg.c +++ b/sys/dev/isa/if_eg.c @@ -730,7 +730,7 @@ egread(struct eg_softc *sc, void *buf, int len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/isa/if_el.c b/sys/dev/isa/if_el.c index f2c3c5a..1e7043d 100644 --- a/sys/dev/isa/if_el.c +++ b/sys/dev/isa/if_el.c @@ -591,7 +591,7 @@ elread(struct el_softc *sc, int len) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/isa/if_iy.c b/sys/dev/isa/if_iy.c index acf1374..94313ca 100644 --- a/sys/dev/isa/if_iy.c +++ b/sys/dev/isa/if_iy.c @@ -1046,7 +1046,7 @@ iyget(struct iy_softc *sc, bus_space_tag_t iot, bus_space_handle_t ioh, int rxle bpf_mtap(ifp, top); - if_input(ifp, top); + if_percpuq_enqueue(ifp->if_percpuq, top); return; dropped: diff --git a/sys/dev/marvell/if_gfe.c b/sys/dev/marvell/if_gfe.c index a8f15bb..e4164c9 100644 --- a/sys/dev/marvell/if_gfe.c +++ b/sys/dev/marvell/if_gfe.c @@ -955,7 +955,7 @@ gfe_rx_get(struct gfe_softc *sc, enum gfe_rxprio rxprio) (eh->ether_dhost[0] & 1) != 0 || memcmp(eh->ether_dhost, CLLADDR(ifp->if_sadl), ETHER_ADDR_LEN) == 0) { - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); m = NULL; GE_DPRINTF(sc, (">")); } else { diff --git a/sys/dev/marvell/if_mvgbe.c b/sys/dev/marvell/if_mvgbe.c index 1e2d97e..6561c82 100644 --- a/sys/dev/marvell/if_mvgbe.c +++ b/sys/dev/marvell/if_mvgbe.c @@ -2085,7 +2085,7 @@ mvgbe_rxeof(struct mvgbe_softc *sc) bpf_mtap(ifp, m); /* pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/marvell/if_mvxpe.c b/sys/dev/marvell/if_mvxpe.c index a9d3a28..d630fde 100644 --- a/sys/dev/marvell/if_mvxpe.c +++ b/sys/dev/marvell/if_mvxpe.c @@ -2448,7 +2448,7 @@ mvxpe_rx_queue(struct mvxpe_softc *sc, int q, int npkt) mvxpe_rx_set_csumflag(ifp, r, m); ifp->if_ipackets++; bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); chunk = NULL; /* the BM chunk goes to networking stack now */ rx_done: if (chunk) { diff --git a/sys/dev/ofw/ofnet.c b/sys/dev/ofw/ofnet.c index 06d2235..0e14ccf 100644 --- a/sys/dev/ofw/ofnet.c +++ b/sys/dev/ofw/ofnet.c @@ -263,7 +263,7 @@ ofnet_read(struct ofnet_softc *of) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, head); + if_percpuq_enqueue(ifp->if_percpuq, head); } splx(s); } diff --git a/sys/dev/pci/cxgb/cxgb_sge.c b/sys/dev/pci/cxgb/cxgb_sge.c index 3482ecb..4070de2 100644 --- a/sys/dev/pci/cxgb/cxgb_sge.c +++ b/sys/dev/pci/cxgb/cxgb_sge.c @@ -2176,7 +2176,7 @@ t3_rx_eth(struct adapter *adap, struct sge_rspq *rq, struct mbuf *m, int ethpad) */ m_adj(m, sizeof(*cpl) + ethpad); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /** diff --git a/sys/dev/pci/if_age.c b/sys/dev/pci/if_age.c index b950c17..af7d7fd 100644 --- a/sys/dev/pci/if_age.c +++ b/sys/dev/pci/if_age.c @@ -1505,7 +1505,7 @@ age_rxeof(struct age_softc *sc, struct rx_rdesc *rxrd) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* Reset mbuf chains. */ AGE_RXCHAIN_RESET(sc); diff --git a/sys/dev/pci/if_alc.c b/sys/dev/pci/if_alc.c index 4135386..e6b5ca4 100644 --- a/sys/dev/pci/if_alc.c +++ b/sys/dev/pci/if_alc.c @@ -2596,7 +2596,7 @@ alc_rxeof(struct alc_softc *sc, struct rx_rdesc *rrd) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } /* Reset mbuf chains. */ diff --git a/sys/dev/pci/if_ale.c b/sys/dev/pci/if_ale.c index 90c42ee..5a08122 100644 --- a/sys/dev/pci/if_ale.c +++ b/sys/dev/pci/if_ale.c @@ -1548,7 +1548,7 @@ ale_rxeof(struct ale_softc *sc) bpf_mtap(ifp, m); /* Pass it to upper layer. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ale_rx_update_page(sc, &rx_page, length, &prod); } diff --git a/sys/dev/pci/if_bce.c b/sys/dev/pci/if_bce.c index 9f07de1..8e5bb0d 100644 --- a/sys/dev/pci/if_bce.c +++ b/sys/dev/pci/if_bce.c @@ -815,7 +815,7 @@ bce_rxintr(struct bce_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input (ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* re-check current in case it changed */ curr = (bus_space_read_4(sc->bce_btag, sc->bce_bhandle, diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c index c59eda5..5de7f67 100644 --- a/sys/dev/pci/if_bge.c +++ b/sys/dev/pci/if_bge.c @@ -4574,7 +4574,7 @@ bge_rxeof(struct bge_softc *sc) VLAN_INPUT_TAG(ifp, m, cur_rx->bge_vlan_tag, continue); } - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } sc->bge_rx_saved_considx = rx_cons; diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c index 74e4f5f..f85326b 100644 --- a/sys/dev/pci/if_bnx.c +++ b/sys/dev/pci/if_bnx.c @@ -4647,7 +4647,7 @@ bnx_rx_intr(struct bnx_softc *sc) ifp->if_ipackets++; DBPRINT(sc, BNX_VERBOSE_RECV, "%s(): Passing received frame up.\n", __func__); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); DBRUNIF(1, sc->rx_mbuf_alloc--); } diff --git a/sys/dev/pci/if_cas.c b/sys/dev/pci/if_cas.c index 37ced60..4c0b40f 100644 --- a/sys/dev/pci/if_cas.c +++ b/sys/dev/pci/if_cas.c @@ -1303,7 +1303,7 @@ cas_rint(struct cas_softc *sc) ifp->if_ipackets++; m->m_pkthdr.csum_flags = 0; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } else ifp->if_ierrors++; } @@ -1336,7 +1336,7 @@ cas_rint(struct cas_softc *sc) ifp->if_ipackets++; m->m_pkthdr.csum_flags = 0; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } else ifp->if_ierrors++; } diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c index f916419..638243f 100644 --- a/sys/dev/pci/if_de.c +++ b/sys/dev/pci/if_de.c @@ -3750,7 +3750,7 @@ tulip_rx_intr( ms->m_pkthdr.len = total_len; ms->m_pkthdr.rcvif = ifp; #if defined(__NetBSD__) - if_input(ifp, ms); + if_percpuq_enqueue(ifp->if_percpuq, ms); #else m_adj(ms, sizeof(struct ether_header)); ether_input(ifp, &eh, ms); @@ -3764,7 +3764,7 @@ tulip_rx_intr( m0->m_len = m0->m_pkthdr.len = total_len; m0->m_pkthdr.rcvif = ifp; #if defined(__NetBSD__) - if_input(ifp, m0); + if_percpuq_enqueue(ifp->if_percpuq, m0); #else m_adj(m0, sizeof(struct ether_header)); ether_input(ifp, &eh, m0); diff --git a/sys/dev/pci/if_dge.c b/sys/dev/pci/if_dge.c index 570b935..9832a0f 100644 --- a/sys/dev/pci/if_dge.c +++ b/sys/dev/pci/if_dge.c @@ -1763,7 +1763,7 @@ dge_rxintr(struct dge_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_et.c b/sys/dev/pci/if_et.c index 35efae3..12bf465 100644 --- a/sys/dev/pci/if_et.c +++ b/sys/dev/pci/if_et.c @@ -1759,7 +1759,7 @@ et_rxeof(struct et_softc *sc) bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } else { ifp->if_ierrors++; diff --git a/sys/dev/pci/if_jme.c b/sys/dev/pci/if_jme.c index d4045ce..9103c4d 100644 --- a/sys/dev/pci/if_jme.c +++ b/sys/dev/pci/if_jme.c @@ -1213,7 +1213,7 @@ jme_intr_rx(jme_softc_t *sc) { VLAN_INPUT_TAG(ifp, mhead, (flags & JME_RD_VLAN_MASK), continue); } - if_input(ifp, mhead); + if_percpuq_enqueue(ifp->if_percpuq, mhead); } if (ipackets) rnd_add_uint32(&sc->rnd_source, ipackets); diff --git a/sys/dev/pci/if_kse.c b/sys/dev/pci/if_kse.c index 05bf539..792e2c9 100644 --- a/sys/dev/pci/if_kse.c +++ b/sys/dev/pci/if_kse.c @@ -1200,7 +1200,7 @@ rxintr(struct kse_softc *sc) m->m_pkthdr.csum_flags |= M_CSUM_TCP_UDP_BAD; } bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); #ifdef KSEDIAGNOSTIC if (kse_monitor_rxintr > 0) { printf("m stat %x data %p len %d\n", diff --git a/sys/dev/pci/if_lii.c b/sys/dev/pci/if_lii.c index 3a68627..d8c9d28 100644 --- a/sys/dev/pci/if_lii.c +++ b/sys/dev/pci/if_lii.c @@ -1001,7 +1001,7 @@ lii_rxintr(struct lii_softc *sc) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } AT_WRITE_4(sc, ATL2_MB_RXD_RD_IDX, sc->sc_rxcur); diff --git a/sys/dev/pci/if_msk.c b/sys/dev/pci/if_msk.c index 237668f..043bd49 100644 --- a/sys/dev/pci/if_msk.c +++ b/sys/dev/pci/if_msk.c @@ -1751,7 +1751,7 @@ msk_rxeof(struct sk_if_softc *sc_if, u_int16_t len, u_int32_t rxstat) bpf_mtap(ifp, m); /* pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } void diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c index 817aa9a..bd1ed92 100644 --- a/sys/dev/pci/if_nfe.c +++ b/sys/dev/pci/if_nfe.c @@ -946,7 +946,7 @@ mbufcopied: } bpf_mtap(ifp, m); ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); skip1: /* update mapping address in h/w descriptor */ diff --git a/sys/dev/pci/if_pcn.c b/sys/dev/pci/if_pcn.c index 3bdc599..bd0cbb3 100644 --- a/sys/dev/pci/if_pcn.c +++ b/sys/dev/pci/if_pcn.c @@ -1551,7 +1551,7 @@ pcn_rxintr(struct pcn_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; } diff --git a/sys/dev/pci/if_sip.c b/sys/dev/pci/if_sip.c index 5752c79..eec0666 100644 --- a/sys/dev/pci/if_sip.c +++ b/sys/dev/pci/if_sip.c @@ -2242,7 +2242,7 @@ gsip_rxintr(struct sip_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ @@ -2409,7 +2409,7 @@ sip_rxintr(struct sip_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index 2f3e424..93dc657 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -2117,7 +2117,7 @@ sk_rxeof(struct sk_if_softc *sc_if) bpf_mtap(ifp, m); /* pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/pci/if_ste.c b/sys/dev/pci/if_ste.c index 34e9e13..cc7f21b 100644 --- a/sys/dev/pci/if_ste.c +++ b/sys/dev/pci/if_ste.c @@ -1050,7 +1050,7 @@ ste_rxintr(struct ste_softc *sc) bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_stge.c b/sys/dev/pci/if_stge.c index 6cce8b9..6745432 100644 --- a/sys/dev/pci/if_stge.c +++ b/sys/dev/pci/if_stge.c @@ -1377,7 +1377,7 @@ stge_rxintr(struct stge_softc *sc) } #endif /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_ti.c b/sys/dev/pci/if_ti.c index 4912d8a..3686cb1 100644 --- a/sys/dev/pci/if_ti.c +++ b/sys/dev/pci/if_ti.c @@ -2030,7 +2030,7 @@ ti_rxeof(struct ti_softc *sc) continue); } - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Only necessary on the Tigon 1. */ diff --git a/sys/dev/pci/if_tl.c b/sys/dev/pci/if_tl.c index a9dfb1b..5faa114 100644 --- a/sys/dev/pci/if_tl.c +++ b/sys/dev/pci/if_tl.c @@ -1078,7 +1078,7 @@ tl_intr(void *v) } #endif bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } bus_dmamap_sync(sc->tl_dmatag, sc->Rx_dmamap, 0, diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c index bf560e3..d6267b5 100644 --- a/sys/dev/pci/if_txp.c +++ b/sys/dev/pci/if_txp.c @@ -751,7 +751,7 @@ txp_rx_reclaim(struct txp_softc *sc, struct txp_rx_ring *r, struct txp_dma_alloc continue); } - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); next: bus_dmamap_sync(sc->sc_dmat, dma->dma_map, diff --git a/sys/dev/pci/if_vge.c b/sys/dev/pci/if_vge.c index f23f785..d3efd7d 100644 --- a/sys/dev/pci/if_vge.c +++ b/sys/dev/pci/if_vge.c @@ -1373,7 +1373,7 @@ vge_rxeof(struct vge_softc *sc) */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); lim++; if (lim == VGE_NRXDESC) diff --git a/sys/dev/pci/if_vioif.c b/sys/dev/pci/if_vioif.c index 8f1fa30..8d4b461 100644 --- a/sys/dev/pci/if_vioif.c +++ b/sys/dev/pci/if_vioif.c @@ -1038,7 +1038,7 @@ vioif_rx_deq_locked(struct vioif_softc *sc) bpf_mtap(ifp, m); VIOIF_RX_UNLOCK(sc); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); VIOIF_RX_LOCK(sc); if (sc->sc_stopping) diff --git a/sys/dev/pci/if_vr.c b/sys/dev/pci/if_vr.c index 0d1ad42..0fffff8 100644 --- a/sys/dev/pci/if_vr.c +++ b/sys/dev/pci/if_vr.c @@ -788,7 +788,7 @@ vr_rxeof(struct vr_softc *sc) */ bpf_mtap(ifp, m); /* Pass it on. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* Update the receive pointer. */ diff --git a/sys/dev/pci/if_vte.c b/sys/dev/pci/if_vte.c index 8db52291..9273ff6 100644 --- a/sys/dev/pci/if_vte.c +++ b/sys/dev/pci/if_vte.c @@ -1131,7 +1131,7 @@ vte_rxeof(struct vte_softc *sc) m->m_pkthdr.rcvif = ifp; ifp->if_ipackets++; bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } if (prog > 0) { diff --git a/sys/dev/pci/if_xge.c b/sys/dev/pci/if_xge.c index 798528c..fb8bc18 100644 --- a/sys/dev/pci/if_xge.c +++ b/sys/dev/pci/if_xge.c @@ -808,7 +808,7 @@ xge_intr(void *pv) bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); if (++sc->sc_nextrx == NRXREAL) sc->sc_nextrx = 0; diff --git a/sys/dev/pci/ixgbe/ixgbe.c b/sys/dev/pci/ixgbe/ixgbe.c index a93cc94..b844bb4 100644 --- a/sys/dev/pci/ixgbe/ixgbe.c +++ b/sys/dev/pci/ixgbe/ixgbe.c @@ -2972,8 +2972,9 @@ ixgbe_setup_interface(device_t dev, struct adapter *adapter) IFQ_SET_READY(&ifp->if_snd); #endif - if_attach(ifp); + if_initialize(ifp); ether_ifattach(ifp, adapter->hw.mac.addr); + if_register(ifp); ether_set_ifflags_cb(ec, ixgbe_ifflags_cb); adapter->max_frame_size = diff --git a/sys/dev/pci/ixgbe/ixv.c b/sys/dev/pci/ixgbe/ixv.c index 7dc5641..a9fbfb4 100644 --- a/sys/dev/pci/ixgbe/ixv.c +++ b/sys/dev/pci/ixgbe/ixv.c @@ -3372,7 +3372,7 @@ ixv_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype) s = splnet(); /* Pass this up to any BPF listeners. */ bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); splx(s); IXV_RX_LOCK(rxr); diff --git a/sys/dev/pcmcia/if_cnw.c b/sys/dev/pcmcia/if_cnw.c index bf54ff7..70249f4 100644 --- a/sys/dev/pcmcia/if_cnw.c +++ b/sys/dev/pcmcia/if_cnw.c @@ -856,7 +856,7 @@ cnw_recv(struct cnw_softc *sc) bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } } diff --git a/sys/dev/pcmcia/if_malo_pcmcia.c b/sys/dev/pcmcia/if_malo_pcmcia.c index d3b4c93..5c0850a 100644 --- a/sys/dev/pcmcia/if_malo_pcmcia.c +++ b/sys/dev/pcmcia/if_malo_pcmcia.c @@ -1013,7 +1013,7 @@ cmalo_rx(struct malo_softc *sc) /* push the frame up to the network stack if not in monitor mode */ if (ic->ic_opmode != IEEE80211_M_MONITOR) { - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); ifp->if_ipackets++; } } diff --git a/sys/dev/pcmcia/if_ray.c b/sys/dev/pcmcia/if_ray.c index ed62d07..7320750 100644 --- a/sys/dev/pcmcia/if_ray.c +++ b/sys/dev/pcmcia/if_ray.c @@ -1517,7 +1517,7 @@ done: bpf_mtap(ifp, m); /* XXX doesn't appear to be included m->m_flags |= M_HASFCS; */ ifp->if_ipackets++; - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/pcmcia/if_xi.c b/sys/dev/pcmcia/if_xi.c index 0df3f0d..b3453a5 100644 --- a/sys/dev/pcmcia/if_xi.c +++ b/sys/dev/pcmcia/if_xi.c @@ -475,7 +475,7 @@ xi_get(struct xi_softc *sc) bpf_mtap(ifp, top); - if_input(ifp, top); + if_percpuq_enqueue(ifp->if_percpuq, top); return (recvcount); } diff --git a/sys/dev/qbus/if_de.c b/sys/dev/qbus/if_de.c index 49ad29f..77a7cc8 100644 --- a/sys/dev/qbus/if_de.c +++ b/sys/dev/qbus/if_de.c @@ -557,7 +557,7 @@ derecv(struct de_softc *sc) } bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); /* hang the receive buffer again */ next: rp->r_lenerr = 0; diff --git a/sys/dev/qbus/if_il.c b/sys/dev/qbus/if_il.c index fdf3a5f..6610231 100644 --- a/sys/dev/qbus/if_il.c +++ b/sys/dev/qbus/if_il.c @@ -533,7 +533,7 @@ ilrint(void *arg) /* Shave off status hdr */ m_adj(m, 4); - if_input(&sc->sc_if, m); + if_percpuq_enqueue((&sc->sc_if)->if_percpuq, m); setup: /* * Reset for next packet if possible. diff --git a/sys/dev/qbus/if_qe.c b/sys/dev/qbus/if_qe.c index 2ecae27..48951c0 100644 --- a/sys/dev/qbus/if_qe.c +++ b/sys/dev/qbus/if_qe.c @@ -597,7 +597,7 @@ qeintr(void *arg) sc->sc_nextrx = 0; bpf_mtap(ifp, m); if ((status1 & QE_ESETUP) == 0) - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); else m_freem(m); } diff --git a/sys/dev/qbus/if_qt.c b/sys/dev/qbus/if_qt.c index 5e749a1..3ea8f9c 100644 --- a/sys/dev/qbus/if_qt.c +++ b/sys/dev/qbus/if_qt.c @@ -586,7 +586,7 @@ qtrint(struct qt_softc *sc) goto rnext; } bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); rnext: --sc->nrcv; rp->rmd3 = 0; diff --git a/sys/dev/sbus/be.c b/sys/dev/sbus/be.c index e81c0f2..43721c9 100644 --- a/sys/dev/sbus/be.c +++ b/sys/dev/sbus/be.c @@ -574,7 +574,7 @@ be_read(struct be_softc *sc, int idx, int len) */ bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/sbus/qe.c b/sys/dev/sbus/qe.c index 2bee6fe..753ec87 100644 --- a/sys/dev/sbus/qe.c +++ b/sys/dev/sbus/qe.c @@ -429,7 +429,7 @@ qe_read(struct qe_softc *sc, int idx, int len) */ bpf_mtap(ifp, m); /* Pass the packet up. */ - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index 76face1..78b4cf4 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -1173,7 +1173,7 @@ aue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->aue_dev), __func__, m->m_len)); - if_input((ifp), (m)); + if_percpuq_enqueue(ifp->if_percpuq, m); done1: splx(s); diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c index 5698259..34761ba 100644 --- a/sys/dev/usb/if_axe.c +++ b/sys/dev/usb/if_axe.c @@ -1095,7 +1095,7 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->axe_dev), __func__, m->m_len)); - if_input((ifp), (m)); + if_percpuq_enqueue((ifp)->if_percpuq, (m)); splx(s); diff --git a/sys/dev/usb/if_axen.c b/sys/dev/usb/if_axen.c index 8d1e216..d7c300b 100644 --- a/sys/dev/usb/if_axen.c +++ b/sys/dev/usb/if_axen.c @@ -1112,7 +1112,7 @@ axen_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) /* push the packet up */ s = splnet(); bpf_mtap(ifp, m); - if_input((ifp), (m)); + if_percpuq_enqueue((ifp)->if_percpuq, (m)); splx(s); nextpkt: diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c index 45cc622..7b6861d 100644 --- a/sys/dev/usb/if_cdce.c +++ b/sys/dev/usb/if_cdce.c @@ -722,7 +722,7 @@ cdce_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) bpf_mtap(ifp, m); - if_input((ifp), (m)); + if_percpuq_enqueue((ifp)->if_percpuq, (m)); done1: splx(s); diff --git a/sys/dev/usb/if_cue.c b/sys/dev/usb/if_cue.c index 58d3c5f..6c8339f 100644 --- a/sys/dev/usb/if_cue.c +++ b/sys/dev/usb/if_cue.c @@ -798,7 +798,7 @@ cue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->cue_dev), __func__, m->m_len)); - if_input((ifp), (m)); + if_percpuq_enqueue(ifp->if_percpuq, m); done1: splx(s); diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index 77b8ceb..c64303a 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -723,7 +723,7 @@ kue_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(sc->kue_dev), __func__, m->m_len)); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); splx(s); diff --git a/sys/dev/usb/if_smsc.c b/sys/dev/usb/if_smsc.c index 314d0bd..05d25af 100644 --- a/sys/dev/usb/if_smsc.c +++ b/sys/dev/usb/if_smsc.c @@ -1410,7 +1410,7 @@ smsc_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) /* push the packet up */ s = splnet(); bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); splx(s); } diff --git a/sys/dev/usb/if_udav.c b/sys/dev/usb/if_udav.c index e707021..faa1846 100644 --- a/sys/dev/usb/if_udav.c +++ b/sys/dev/usb/if_udav.c @@ -1203,7 +1203,7 @@ udav_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTF(("%s: %s: deliver %d\n", device_xname(sc->sc_dev), __func__, m->m_len)); - if_input((ifp), (m)); + if_percpuq_enqueue((ifp)->if_percpuq, (m)); done1: splx(s); diff --git a/sys/dev/usb/if_upl.c b/sys/dev/usb/if_upl.c index bfe2f02..f659b61 100644 --- a/sys/dev/usb/if_upl.c +++ b/sys/dev/usb/if_upl.c @@ -306,8 +306,9 @@ upl_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_attach(ifp); + if_initialize(ifp); if_register(ifp); + if_alloc_sadl(ifp); bpf_attach(ifp, DLT_RAW, 0); rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev), diff --git a/sys/dev/usb/if_url.c b/sys/dev/usb/if_url.c index 1d54c5b..9c57589 100644 --- a/sys/dev/usb/if_url.c +++ b/sys/dev/usb/if_url.c @@ -1065,7 +1065,7 @@ url_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) DPRINTF(("%s: %s: deliver %d\n", device_xname(sc->sc_dev), __func__, m->m_len)); - if_input((ifp), (m)); + if_percpuq_enqueue((ifp)->if_percpuq, (m)); done1: splx(s); diff --git a/sys/dev/usb/if_urndis.c b/sys/dev/usb/if_urndis.c index 5448fef..95dddfc 100644 --- a/sys/dev/usb/if_urndis.c +++ b/sys/dev/usb/if_urndis.c @@ -874,7 +874,7 @@ urndis_decap(struct urndis_softc *sc, struct urndis_chain *c, uint32_t len) bpf_mtap(ifp, m); - if_input((ifp), (m)); + if_percpuq_enqueue(ifp->if_percpuq, m); } splx(s); diff --git a/sys/net/agr/if_agr.c b/sys/net/agr/if_agr.c index 4524715..a48f9c6 100644 --- a/sys/net/agr/if_agr.c +++ b/sys/net/agr/if_agr.c @@ -158,7 +158,7 @@ agr_input(struct ifnet *ifp_port, struct mbuf *m) #endif bpf_mtap(ifp, m); - if_input(ifp, m); + if_percpuq_enqueue(ifp->if_percpuq, m); } /* diff --git a/sys/net/bpf.c b/sys/net/bpf.c index a3af562..2250329 100644 --- a/sys/net/bpf.c +++ b/sys/net/bpf.c @@ -720,7 +720,7 @@ bpf_write(struct file *fp, off_t *offp, struct uio *uio, if (mc != NULL) { if (error == 0) - if_input(ifp, mc); + ifp->_if_input(ifp, mc); else m_freem(mc); } diff --git a/sys/net/if.c b/sys/net/if.c index 89011f8..9fa6286 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -200,6 +200,14 @@ static int ifconf(u_long, void *); static int if_clone_create(const char *); static int if_clone_destroy(const char *); +struct if_percpuq { + struct ifnet *ipq_ifp; + void *ipq_si; + struct percpu *ipq_ifqs; /* struct ifqueue */ +}; + +static struct mbuf *if_percpuq_dequeue(struct if_percpuq *); + #if defined(INET) || defined(INET6) static void sysctl_net_pktq_setup(struct sysctllog **, int); #endif @@ -706,7 +714,7 @@ if_percpuq_create(struct ifnet *ifp) return ipq; } -struct mbuf * +static struct mbuf * if_percpuq_dequeue(struct if_percpuq *ipq) { struct mbuf *m; @@ -734,6 +742,10 @@ void if_percpuq_destroy(struct if_percpuq *ipq) { + /* if_detach may already destroy it */ + if (ipq == NULL) + return; + softint_disestablish(ipq->ipq_si); percpu_foreach(ipq->ipq_ifqs, &if_percpuq_purge_ifq, NULL); percpu_free(ipq->ipq_ifqs, sizeof(struct ifqueue)); @@ -742,10 +754,13 @@ if_percpuq_destroy(struct if_percpuq *ipq) void if_percpuq_enqueue(struct if_percpuq *ipq, struct mbuf *m) { - struct ifqueue *ifq = percpu_getref(ipq->ipq_ifqs); + struct ifqueue *ifq; int s; + KASSERT(ipq != NULL); + s = splnet(); + ifq = percpu_getref(ipq->ipq_ifqs); if (IF_QFULL(ifq)) { IF_DROP(ifq); m_freem(m); @@ -760,21 +775,18 @@ out: } /* - * The common interface input routine that is called by device drivers. - * We ensure that the upper layer routines, e.g., ether_input and bridge_input, - * aren't run in hardware interrupt context. + * The common interface input routine that is called by device drivers, + * which should be used only when the driver's rx handler already runs + * in softint. */ void if_input(struct ifnet *ifp, struct mbuf *m) { - if (ifp->if_percpuq) { - if_percpuq_enqueue(ifp->if_percpuq, m); - } else { - KASSERT(!cpu_intr_p()); + KASSERT(ifp->if_percpuq == NULL); + KASSERT(!cpu_intr_p()); - ifp->_if_input(ifp, m); - } + ifp->_if_input(ifp, m); } /* @@ -1060,8 +1072,10 @@ again: xc = xc_broadcast(0, (xcfunc_t)nullop, NULL, NULL); xc_wait(xc); - if (ifp->if_percpuq != NULL) + if (ifp->if_percpuq != NULL) { if_percpuq_destroy(ifp->if_percpuq); + ifp->if_percpuq = NULL; + } splx(s); } diff --git a/sys/net/if.h b/sys/net/if.h index bf619ec..e069f6d 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -952,18 +952,11 @@ int if_clone_list(int, char *, int *); void if_input(struct ifnet *, struct mbuf *); -struct if_percpuq { - struct ifnet *ipq_ifp; - void *ipq_si; - struct percpu *ipq_ifqs; /* struct ifqueue */ -}; - struct if_percpuq * if_percpuq_create(struct ifnet *); void if_percpuq_destroy(struct if_percpuq *); -void if_percpuq_enqueue(struct if_percpuq *, struct mbuf *); -struct mbuf * - if_percpuq_dequeue(struct if_percpuq *); +void + if_percpuq_enqueue(struct if_percpuq *, struct mbuf *); void ifa_insert(struct ifnet *, struct ifaddr *); void ifa_remove(struct ifnet *, struct ifaddr *); diff --git a/sys/netinet/ip_etherip.c b/sys/netinet/ip_etherip.c index 05f8765..d60d0f8 100644 --- a/sys/netinet/ip_etherip.c +++ b/sys/netinet/ip_etherip.c @@ -259,7 +259,7 @@ ip_etherip_input(struct mbuf *m, ...) ifp->if_ipackets++; s = splnet(); - ifp->_if_input(ifp, m); + if_input(ifp, m); splx(s); return; diff --git a/sys/netinet6/ip6_etherip.c b/sys/netinet6/ip6_etherip.c index 60d85ba..80795af 100644 --- a/sys/netinet6/ip6_etherip.c +++ b/sys/netinet6/ip6_etherip.c @@ -264,7 +264,7 @@ ip6_etherip_input(struct mbuf **mp, int *offp, int proto) ifp->if_ipackets++; s = splnet(); - ifp->_if_input(ifp, m); + if_input(ifp, m); splx(s); return IPPROTO_DONE;