From: Sepherosa Ziehau Date: Sat, 25 Jul 2015 12:58:08 +0000 (+0800) Subject: netif: Configure mbuf clusters/jclusters limits X-Git-Tag: v4.3.1~57 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/149299793f827f46e583a944e1732010317ac923 netif: Configure mbuf clusters/jclusters limits Default mbuf clusters limit work for most of the network device drivers. The drivers modified by this commit: - Use mbuf jclusters. - Size of the reception queues could be configured. - Support multiple reception queues. et(4) and mxge(4) are special; they use non-cluster mbuf for small packets reception, so we adjust non-cluster mbuf limit manually in these two drivers. --- diff --git a/sys/dev/netif/ath/ath/if_ath.c b/sys/dev/netif/ath/ath/if_ath.c index 5ced7e89a2..77dee08a31 100644 --- a/sys/dev/netif/ath/ath/if_ath.c +++ b/sys/dev/netif/ath/ath/if_ath.c @@ -847,6 +847,10 @@ ath_attach(u_int16_t devid, struct ath_softc *sc) ifp->if_ioctl = ath_ioctl; ifp->if_init = ath_init; #if defined(__DragonFly__) + if (sc->sc_isedma) + ifp->if_nmbjclusters = ath_rxbuf; + else + ifp->if_nmbclusters = ath_rxbuf; ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN); #else IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); diff --git a/sys/dev/netif/bce/if_bce.c b/sys/dev/netif/bce/if_bce.c index 59ac0eb0d8..f008aeba09 100644 --- a/sys/dev/netif/bce/if_bce.c +++ b/sys/dev/netif/bce/if_bce.c @@ -997,6 +997,8 @@ bce_attach(device_t dev) else ifp->if_baudrate = IF_Gbps(1); + ifp->if_nmbclusters = sc->rx_ring_cnt * USABLE_RX_BD(&sc->rx_rings[0]); + ifq_set_maxlen(&ifp->if_snd, USABLE_TX_BD(&sc->tx_rings[0])); ifq_set_ready(&ifp->if_snd); ifq_set_subq_cnt(&ifp->if_snd, sc->tx_ring_cnt); diff --git a/sys/dev/netif/bge/if_bge.c b/sys/dev/netif/bge/if_bge.c index 01120dfa19..45391b7dee 100644 --- a/sys/dev/netif/bge/if_bge.c +++ b/sys/dev/netif/bge/if_bge.c @@ -2460,6 +2460,7 @@ bge_attach(device_t dev) ifp->if_init = bge_init; ifp->if_mtu = ETHERMTU; ifp->if_capabilities = IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU; + ifp->if_nmbclusters = BGE_STD_RX_RING_CNT; ifq_set_maxlen(&ifp->if_snd, BGE_TX_RING_CNT - 1); ifq_set_ready(&ifp->if_snd); diff --git a/sys/dev/netif/bnx/if_bnx.c b/sys/dev/netif/bnx/if_bnx.c index 8f4354d404..ffab295e58 100644 --- a/sys/dev/netif/bnx/if_bnx.c +++ b/sys/dev/netif/bnx/if_bnx.c @@ -2211,6 +2211,8 @@ bnx_attach(device_t dev) ifp->if_capabilities |= IFCAP_RSS; ifp->if_capenable = ifp->if_capabilities; + ifp->if_nmbclusters = BGE_STD_RX_RING_CNT; + ifq_set_maxlen(&ifp->if_snd, BGE_TX_RING_CNT - 1); ifq_set_ready(&ifp->if_snd); ifq_set_subq_cnt(&ifp->if_snd, sc->bnx_tx_ringcnt); diff --git a/sys/dev/netif/em/if_em.c b/sys/dev/netif/em/if_em.c index 938ca9ecb5..78d5a131d7 100644 --- a/sys/dev/netif/em/if_em.c +++ b/sys/dev/netif/em/if_em.c @@ -2522,6 +2522,7 @@ em_setup_ifp(struct adapter *adapter) ifp->if_npoll = em_npoll; #endif ifp->if_watchdog = em_watchdog; + ifp->if_nmbclusters = adapter->num_rx_desc; ifq_set_maxlen(&ifp->if_snd, adapter->num_tx_desc - 1); ifq_set_ready(&ifp->if_snd); diff --git a/sys/dev/netif/emx/if_emx.c b/sys/dev/netif/emx/if_emx.c index 824590e8e6..708eda6746 100644 --- a/sys/dev/netif/emx/if_emx.c +++ b/sys/dev/netif/emx/if_emx.c @@ -2029,6 +2029,8 @@ emx_setup_ifp(struct emx_softc *sc) ifp->if_serialize_assert = emx_serialize_assert; #endif + ifp->if_nmbclusters = sc->rx_ring_cnt * sc->rx_data[0].num_rx_desc; + ifq_set_maxlen(&ifp->if_snd, sc->tx_data[0].num_tx_desc - 1); ifq_set_ready(&ifp->if_snd); ifq_set_subq_cnt(&ifp->if_snd, sc->tx_ring_cnt); diff --git a/sys/dev/netif/et/if_et.c b/sys/dev/netif/et/if_et.c index 4d06ac4e4b..13501b5cd6 100644 --- a/sys/dev/netif/et/if_et.c +++ b/sys/dev/netif/et/if_et.c @@ -343,6 +343,7 @@ et_attach(device_t dev) ifp->if_mtu = ETHERMTU; ifp->if_capabilities = IFCAP_VLAN_MTU; ifp->if_capenable = ifp->if_capabilities; + ifp->if_nmbclusters = ET_RX_NDESC; ifq_set_maxlen(&ifp->if_snd, ET_TX_NDESC); ifq_set_ready(&ifp->if_snd); @@ -367,6 +368,9 @@ et_attach(device_t dev) goto fail; } + /* Increase non-cluster mbuf limit; used by tiny RX ring */ + mb_inclimit(ET_RX_NDESC); + return 0; fail: et_detach(dev); @@ -387,6 +391,9 @@ et_detach(device_t dev) lwkt_serialize_exit(ifp->if_serializer); ether_ifdetach(ifp); + + /* Decrease non-cluster mbuf limit increased by us */ + mb_inclimit(-ET_RX_NDESC); } if (sc->sc_miibus != NULL) diff --git a/sys/dev/netif/igb/if_igb.c b/sys/dev/netif/igb/if_igb.c index 8bed40033e..7b12d0237b 100644 --- a/sys/dev/netif/igb/if_igb.c +++ b/sys/dev/netif/igb/if_igb.c @@ -1557,6 +1557,8 @@ igb_setup_ifp(struct igb_softc *sc) ifp->if_npoll = igb_npoll; #endif + ifp->if_nmbclusters = sc->rx_ring_cnt * sc->rx_rings[0].num_rx_desc; + ifq_set_maxlen(&ifp->if_snd, sc->tx_rings[0].num_tx_desc - 1); ifq_set_ready(&ifp->if_snd); ifq_set_subq_cnt(&ifp->if_snd, sc->tx_ring_cnt); diff --git a/sys/dev/netif/iwn/if_iwn.c b/sys/dev/netif/iwn/if_iwn.c index 036c575923..8b408b8cf5 100644 --- a/sys/dev/netif/iwn/if_iwn.c +++ b/sys/dev/netif/iwn/if_iwn.c @@ -663,6 +663,7 @@ iwn_attach(device_t dev) ifp->if_ioctl = iwn_ioctl; ifp->if_start = iwn_start; #if defined(__DragonFly__) + ifp->if_nmbjclusters = IWN_RX_RING_COUNT; ifq_set_maxlen(&ifp->if_snd, ifqmaxlen); #else IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); diff --git a/sys/dev/netif/ix/if_ix.c b/sys/dev/netif/ix/if_ix.c index 519b38c925..25f866769c 100644 --- a/sys/dev/netif/ix/if_ix.c +++ b/sys/dev/netif/ix/if_ix.c @@ -1539,6 +1539,9 @@ ix_setup_ifp(struct ix_softc *sc) /* Increase TSO burst length */ ifp->if_tsolen = (8 * ETHERMTU); + ifp->if_nmbclusters = sc->rx_ring_cnt * sc->rx_rings[0].rx_ndesc; + ifp->if_nmbjclusters = ifp->if_nmbclusters; + ifq_set_maxlen(&ifp->if_snd, sc->tx_rings[0].tx_ndesc - 2); ifq_set_ready(&ifp->if_snd); ifq_set_subq_cnt(&ifp->if_snd, sc->tx_ring_cnt); diff --git a/sys/dev/netif/jme/if_jme.c b/sys/dev/netif/jme/if_jme.c index ef085fe742..98e5c17f5c 100644 --- a/sys/dev/netif/jme/if_jme.c +++ b/sys/dev/netif/jme/if_jme.c @@ -1027,6 +1027,8 @@ jme_attach(device_t dev) #ifdef INVARIANTS ifp->if_serialize_assert = jme_serialize_assert; #endif + ifp->if_nmbclusters = sc->jme_cdata.jme_rx_ring_cnt * + sc->jme_cdata.jme_rx_data[0].jme_rx_desc_cnt; ifq_set_maxlen(&ifp->if_snd, sc->jme_cdata.jme_tx_data.jme_tx_desc_cnt - JME_TXD_RSVD); ifq_set_ready(&ifp->if_snd); diff --git a/sys/dev/netif/mxge/if_mxge.c b/sys/dev/netif/mxge/if_mxge.c index 1327de107b..6930ccd480 100644 --- a/sys/dev/netif/mxge/if_mxge.c +++ b/sys/dev/netif/mxge/if_mxge.c @@ -3193,6 +3193,9 @@ mxge_alloc_rings(mxge_softc_t *sc) tx_ring_entries, rx_ring_entries); } + sc->ifp->if_nmbclusters = rx_ring_entries * sc->num_slices; + sc->ifp->if_nmbjclusters = sc->ifp->if_nmbclusters; + ifq_set_maxlen(&sc->ifp->if_snd, tx_ring_entries - 1); ifq_set_ready(&sc->ifp->if_snd); ifq_set_subq_cnt(&sc->ifp->if_snd, sc->num_tx_rings); @@ -4403,6 +4406,9 @@ mxge_attach(device_t dev) mxge_add_sysctls(sc); + /* Increase non-cluster mbuf limit; used by small RX rings */ + mb_inclimit(ifp->if_nmbclusters); + callout_reset_bycpu(&sc->co_hdl, mxge_ticks, mxge_tick, sc, sc->ss[0].intr_cpuid); return 0; @@ -4419,6 +4425,7 @@ mxge_detach(device_t dev) if (device_is_attached(dev)) { struct ifnet *ifp = sc->ifp; + int mblimit = ifp->if_nmbclusters; ifnet_serialize_all(ifp); @@ -4434,6 +4441,9 @@ mxge_detach(device_t dev) callout_terminate(&sc->co_hdl); ether_ifdetach(ifp); + + /* Decrease non-cluster mbuf limit increased by us */ + mb_inclimit(-mblimit); } ifmedia_removeall(&sc->media); diff --git a/sys/dev/netif/nfe/if_nfe.c b/sys/dev/netif/nfe/if_nfe.c index 5c65e59014..172b13003f 100644 --- a/sys/dev/netif/nfe/if_nfe.c +++ b/sys/dev/netif/nfe/if_nfe.c @@ -613,6 +613,7 @@ nfe_attach(device_t dev) #endif ifp->if_watchdog = nfe_watchdog; ifp->if_init = nfe_init; + ifp->if_nmbclusters = sc->sc_rx_ring_count; ifq_set_maxlen(&ifp->if_snd, sc->sc_tx_ring_count); ifq_set_ready(&ifp->if_snd); diff --git a/sys/dev/netif/oce/oce_if.c b/sys/dev/netif/oce/oce_if.c index b6e0f6533f..0055854e47 100644 --- a/sys/dev/netif/oce/oce_if.c +++ b/sys/dev/netif/oce/oce_if.c @@ -1675,6 +1675,8 @@ oce_attach_ifp(POCE_SOFTC sc) if_initname(sc->ifp, device_get_name(sc->dev), device_get_unit(sc->dev)); + sc->ifp->if_nmbclusters = sc->nrqs * sc->rq[0]->cfg.q_len; + ifq_set_maxlen(&sc->ifp->if_snd, OCE_MAX_TX_DESC - 1); ifq_set_ready(&sc->ifp->if_snd); diff --git a/sys/dev/netif/re/if_re.c b/sys/dev/netif/re/if_re.c index c660574e88..76a7db6a33 100644 --- a/sys/dev/netif/re/if_re.c +++ b/sys/dev/netif/re/if_re.c @@ -1601,6 +1601,7 @@ re_attach(device_t dev) ifp->if_baudrate = 1000000000; else ifp->if_baudrate = 100000000; + ifp->if_nmbclusters = sc->re_rx_desc_cnt; ifq_set_maxlen(&ifp->if_snd, qlen); ifq_set_ready(&ifp->if_snd); diff --git a/sys/dev/netif/wpi/if_wpi.c b/sys/dev/netif/wpi/if_wpi.c index 5bebf5b9b0..07a698a265 100644 --- a/sys/dev/netif/wpi/if_wpi.c +++ b/sys/dev/netif/wpi/if_wpi.c @@ -680,6 +680,7 @@ wpi_attach(device_t dev) ifp->if_ioctl = wpi_ioctl; ifp->if_start = wpi_start; #if defined(__DragonFly__) + ifp->if_nmbjclusters = WPI_RX_RING_COUNT; ifq_set_maxlen(&ifp->if_snd, ifqmaxlen); #else IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);