netif: Configure mbuf clusters/jclusters limits
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 25 Jul 2015 12:58:08 +0000 (20:58 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 25 Jul 2015 13:05:18 +0000 (21:05 +0800)
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.

16 files changed:
sys/dev/netif/ath/ath/if_ath.c
sys/dev/netif/bce/if_bce.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/bnx/if_bnx.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/igb/if_igb.c
sys/dev/netif/iwn/if_iwn.c
sys/dev/netif/ix/if_ix.c
sys/dev/netif/jme/if_jme.c
sys/dev/netif/mxge/if_mxge.c
sys/dev/netif/nfe/if_nfe.c
sys/dev/netif/oce/oce_if.c
sys/dev/netif/re/if_re.c
sys/dev/netif/wpi/if_wpi.c

index 5ced7e8..77dee08 100644 (file)
@@ -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);
index 59ac0eb..f008aeb 100644 (file)
@@ -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);
index 01120df..45391b7 100644 (file)
@@ -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);
 
index 8f4354d..ffab295 100644 (file)
@@ -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);
index 938ca9e..78d5a13 100644 (file)
@@ -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);
 
index 824590e..708eda6 100644 (file)
@@ -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);
index 4d06ac4..13501b5 100644 (file)
@@ -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)
index 8bed400..7b12d02 100644 (file)
@@ -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);
index 036c575..8b408b8 100644 (file)
@@ -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);
index 519b38c..25f8667 100644 (file)
@@ -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);
index ef085fe..98e5c17 100644 (file)
@@ -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);
index 1327de1..6930ccd 100644 (file)
@@ -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);
 
index 5c65e59..172b130 100644 (file)
@@ -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);
 
index b6e0f65..0055854 100644 (file)
@@ -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);
 
index c660574..76a7db6 100644 (file)
@@ -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);
 
index 5bebf5b..07a698a 100644 (file)
@@ -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);