From owner-svn-src-user@FreeBSD.ORG Mon Jun 15 20:00:19 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id BF902106566C; Mon, 15 Jun 2009 20:00:19 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id AD49D8FC1A; Mon, 15 Jun 2009 20:00:19 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5FK0JE3099941; Mon, 15 Jun 2009 20:00:19 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5FK0JqK099940; Mon, 15 Jun 2009 20:00:19 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906152000.n5FK0JqK099940@svn.freebsd.org> From: Kip Macy Date: Mon, 15 Jun 2009 20:00:19 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r194260 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Jun 2009 20:00:20 -0000 Author: kmacy Date: Mon Jun 15 20:00:19 2009 New Revision: 194260 URL: http://svn.freebsd.org/changeset/base/194260 Log: make tx reclaim and tx coalesce threshold values tunables and read-write sysctls Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c ============================================================================== --- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Mon Jun 15 19:50:03 2009 (r194259) +++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Mon Jun 15 20:00:19 2009 (r194260) @@ -78,12 +78,38 @@ TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb SYSCTL_UINT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_buf_ring_size, 0, "size of per-queue mbuf ring"); -static int cxgb_pcpu_tx_coalesce_force = 0; -TUNABLE_INT("hw.cxgb.tx_coalesce_force", &cxgb_pcpu_tx_coalesce_force); -SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce, CTLFLAG_RW, - &cxgb_pcpu_tx_coalesce_force, 0, +static int cxgb_tx_coalesce_force = 0; +TUNABLE_INT("hw.cxgb.tx_coalesce_force", &cxgb_tx_coalesce_force); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce_force, CTLFLAG_RW, + &cxgb_tx_coalesce_force, 0, "coalesce small packets into a single work request regardless of ring state"); +#define COALESCE_START_DEFAULT TX_ETH_Q_SIZE>>1 +#define COALESCE_START_MAX (TX_ETH_Q_SIZE-(TX_ETH_Q_SIZE>>3)) +#define COALESCE_STOP_DEFAULT TX_ETH_Q_SIZE>>2 +#define COALESCE_STOP_MIN TX_ETH_Q_SIZE>>5 +#define TX_RECLAIM_DEFAULT TX_ETH_Q_SIZE>>5 +#define TX_RECLAIM_MAX TX_ETH_Q_SIZE>>2 +#define TX_RECLAIM_MIN TX_ETH_Q_SIZE>>6 + + +static int cxgb_tx_coalesce_enable_start = COALESCE_START_DEFAULT; +TUNABLE_INT("hw.cxgb.tx_coalesce_enable_start", + &cxgb_tx_coalesce_enable_start); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce_enable_start, CTLFLAG_RW, + &cxgb_tx_coalesce_enable_start, 0, + "coalesce enable threshold"); +static int cxgb_tx_coalesce_enable_stop = COALESCE_STOP_DEFAULT; +TUNABLE_INT("hw.cxgb.tx_coalesce_enable_stop", &cxgb_tx_coalesce_enable_stop); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_coalesce_enable_stop, CTLFLAG_RW, + &cxgb_tx_coalesce_enable_stop, 0, + "coalesce disable threshold"); +static int cxgb_tx_reclaim_threshold = TX_RECLAIM_DEFAULT; +TUNABLE_INT("hw.cxgb.tx_reclaim_threshold", &cxgb_tx_reclaim_threshold); +SYSCTL_UINT(_hw_cxgb, OID_AUTO, tx_reclaim_threshold, CTLFLAG_RW, + &cxgb_tx_reclaim_threshold, 0, + "tx cleaning minimum threshold"); + /* * XXX don't re-enable this until TOE stops assuming * we have an m_ext @@ -97,7 +123,7 @@ int fl_q_size = 0; int jumbo_q_size = 0; extern int cxgb_use_16k_clusters; -extern int cxgb_pcpu_cache_enable; +extern int cxgb_cache_enable; extern int nmbjumbo4; extern int nmbjumbo9; extern int nmbjumbo16; @@ -232,22 +258,26 @@ check_pkt_coalesce(struct sge_qset *qs) struct sge_txq *txq; uint8_t *fill; - if (__predict_false(cxgb_pcpu_tx_coalesce_force)) + if (__predict_false(cxgb_tx_coalesce_force)) return (1); txq = &qs->txq[TXQ_ETH]; sc = qs->port->adapter; fill = &sc->tunq_fill[qs->idx]; + if (cxgb_tx_coalesce_enable_start > COALESCE_START_MAX) + cxgb_tx_coalesce_enable_start = COALESCE_START_MAX; + if (cxgb_tx_coalesce_enable_stop < COALESCE_STOP_MIN) + cxgb_tx_coalesce_enable_start = COALESCE_STOP_MIN; /* * if the hardware transmit queue is more than 1/8 full * we mark it as coalescing - we drop back from coalescing * when we go below 1/32 full and there are no packets enqueued, * this provides us with some degree of hysteresis */ - if (*fill != 0 && (txq->in_use < (txq->size>>5)) && + if (*fill != 0 && (txq->in_use <= cxgb_tx_coalesce_enable_stop) && TXQ_RING_EMPTY(qs) && (qs->coalescing == 0)) *fill = 0; - else if (*fill == 0 && (txq->in_use >= (txq->size>>3))) + else if (*fill == 0 && (txq->in_use >= cxgb_tx_coalesce_enable_start)) *fill = 1; return (sc->tunq_coalesce); @@ -340,6 +370,10 @@ reclaim_completed_tx(struct sge_qset *qs struct sge_txq *q = &qs->txq[queue]; int reclaim = desc_reclaimable(q); + if ((cxgb_tx_reclaim_threshold > TX_RECLAIM_MAX) || + (cxgb_tx_reclaim_threshold < TX_RECLAIM_MIN)) + cxgb_tx_reclaim_threshold = TX_RECLAIM_DEFAULT; + if (reclaim < reclaim_min) return (0); @@ -1563,10 +1597,12 @@ cxgb_tx_watchdog(void *arg) struct sge_qset *qs = arg; struct sge_txq *txq = &qs->txq[TXQ_ETH]; - if (qs->coalescing != 0 && (txq->in_use < (txq->size>>5)) && - TXQ_RING_EMPTY(qs)) + if (qs->coalescing != 0 && + (txq->in_use <= cxgb_tx_coalesce_enable_stop) && + TXQ_RING_EMPTY(qs)) qs->coalescing = 0; - else if (qs->coalescing == 0 && (txq->in_use >= (txq->size>>3))) + else if (qs->coalescing == 0 && + (txq->in_use >= cxgb_tx_coalesce_enable_start)) qs->coalescing = 1; if (TXQ_TRYLOCK(qs)) { qs->qs_flags |= QS_FLUSHING; @@ -1575,7 +1611,7 @@ cxgb_tx_watchdog(void *arg) TXQ_UNLOCK(qs); } if (qs->port->ifp->if_drv_flags & IFF_DRV_RUNNING) - callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog, + callout_reset_on(&txq->txq_watchdog, hz/4, cxgb_tx_watchdog, qs, txq->txq_watchdog.c_cpu); } @@ -1615,7 +1651,7 @@ cxgb_start_locked(struct sge_qset *qs) !TXQ_RING_EMPTY(qs) && (ifp->if_drv_flags & IFF_DRV_RUNNING) && pi->link_config.link_ok) { - reclaim_completed_tx(qs, (TX_ETH_Q_SIZE>>5), TXQ_ETH); + reclaim_completed_tx(qs, cxgb_tx_reclaim_threshold, TXQ_ETH); if ((m_head = cxgb_dequeue(qs)) == NULL) break; @@ -1692,7 +1728,7 @@ cxgb_transmit_locked(struct ifnet *ifp, } else if ((error = drbr_enqueue(ifp, br, m)) != 0) return (error); - reclaim_completed_tx(qs, (TX_ETH_Q_SIZE>>4), TXQ_ETH); + reclaim_completed_tx(qs, cxgb_tx_reclaim_threshold, TXQ_ETH); if (!TXQ_RING_EMPTY(qs) && pi->link_config.link_ok && (!check_pkt_coalesce(qs) || (drbr_inuse(ifp, br) >= 7))) cxgb_start_locked(qs);