From owner-p4-projects@FreeBSD.ORG Mon Aug 20 07:07:17 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7DAD116A41B; Mon, 20 Aug 2007 07:07:17 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 350AF16A417 for ; Mon, 20 Aug 2007 07:07:17 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 22F6213C457 for ; Mon, 20 Aug 2007 07:07:17 +0000 (UTC) (envelope-from kmacy@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l7K77HZI069363 for ; Mon, 20 Aug 2007 07:07:17 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7K77GNQ069360 for perforce@freebsd.org; Mon, 20 Aug 2007 07:07:16 GMT (envelope-from kmacy@freebsd.org) Date: Mon, 20 Aug 2007 07:07:16 GMT Message-Id: <200708200707.l7K77GNQ069360@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to kmacy@freebsd.org using -f From: Kip Macy To: Perforce Change Reviews Cc: Subject: PERFORCE change 125393 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Aug 2007 07:07:17 -0000 http://perforce.freebsd.org/chv.cgi?CH=125393 Change 125393 by kmacy@kmacy_home:ethng on 2007/08/20 07:06:25 - make KASSERT for cpuid == curcpu only compile in for STRICT_AFFINITY - add sysctl information for txq ring stats - split sysctl into 2 parts attach time and post-initialization - fix tx cleaning bug whereby in_use would go negative causing the queue to stall permanently Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#9 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#12 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#9 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#11 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#9 (text+ko) ==== @@ -127,10 +127,12 @@ struct task timer_reclaim_task; struct cdev *port_cdev; +#define PORT_LOCK_NAME_LEN 32 +#define TASKQ_NAME_LEN 32 #define PORT_NAME_LEN 32 -#define TASKQ_NAME_LEN 32 - char lockbuf[PORT_NAME_LEN]; + char lockbuf[PORT_LOCK_NAME_LEN]; char taskqbuf[TASKQ_NAME_LEN]; + char namebuf[PORT_NAME_LEN]; }; enum { /* adapter flags */ @@ -304,6 +306,8 @@ int idx; /* qset # */ int qs_cpuid; int qs_flags; +#define QS_NAME_LEN 32 + char namebuf[QS_NAME_LEN]; }; struct sge { @@ -529,7 +533,8 @@ void t3_rx_eth(struct port_info *p, struct sge_rspq *rq, struct mbuf *m, int ethpad); void t3_lro_flush(adapter_t *adap, struct sge_qset *qs, struct lro_state *state); -void t3_add_sysctls(adapter_t *sc); +void t3_add_attach_sysctls(adapter_t *sc); +void t3_add_configured_sysctls(adapter_t *sc); int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx, unsigned char *data); void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p); ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#12 (text+ko) ==== @@ -600,7 +600,7 @@ G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers)); - t3_add_sysctls(sc); + t3_add_attach_sysctls(sc); out: if (error) cxgb_free(sc); @@ -1565,6 +1565,7 @@ alloc_filters(sc); setup_rss(sc); + t3_add_configured_sysctls(sc); sc->flags |= FULL_INIT_DONE; } ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#9 (text+ko) ==== @@ -410,8 +410,8 @@ m_freem_vec(m_vec[i]); j++; - txq->cleaned += reclaimed; - txq->in_use -= reclaimed; + txq->cleaned += reclaimable; + txq->in_use -= reclaimable; if (isset(&qs->txq_stopped, TXQ_ETH)) clrbit(&qs->txq_stopped, TXQ_ETH); reclaimable = desc_reclaimable(txq); @@ -582,6 +582,7 @@ struct sge_qset *qs = arg; struct thread *td; struct adapter *sc = qs->port->adapter; + struct sge_txq *txq = &qs->txq[TXQ_ETH]; int err = 0; td = curthread; @@ -599,9 +600,9 @@ if (qs->qs_flags & QS_EXITING) break; - if (mtx_trylock(&qs->txq[TXQ_ETH].lock)) { + if (mtx_trylock(&txq->lock)) { err = cxgb_pcpu_start_(qs, NULL, TRUE); - mtx_unlock(&qs->txq[TXQ_ETH].lock); + mtx_unlock(&txq->lock); } else err = EINPROGRESS; @@ -615,13 +616,13 @@ mtx_unlock(&qs->rspq.lock); } - if ((!mbufq_empty(&qs->txq[TXQ_ETH].sendq) || - (qs->txq[TXQ_ETH].txq_mr.mr_cons != qs->txq[TXQ_ETH].txq_mr.mr_prod)) && + if ((!mbufq_empty(&txq->sendq) || + (txq->txq_mr.mr_cons != txq->txq_mr.mr_prod)) && err == 0) { if (cxgb_debug) printf("head=%p cons=%d prod=%d\n", - qs->txq[TXQ_ETH].sendq.head, qs->txq[TXQ_ETH].txq_mr.mr_cons, - qs->txq[TXQ_ETH].txq_mr.mr_prod); + txq->sendq.head, txq->txq_mr.mr_cons, + txq->txq_mr.mr_prod); continue; } tsleep(qs, 1, "cxgbidle", sleep_ticks); ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#11 (text+ko) ==== @@ -1197,7 +1197,7 @@ struct tx_desc *txd; struct cpl_tx_pkt *cpl; -#ifdef IFNET_MULTIQUEUE +#if defined(IFNET_MULTIQUEUE) && defined(STRICT_AFFINITY) KASSERT(qs->qs_cpuid == curcpu, ("cpu qset mismatch cpuid=%d curcpu=%d", qs->qs_cpuid, curcpu)); #endif DPRINTF("t3_encap cpu=%d ", curcpu); @@ -2720,11 +2720,11 @@ void -t3_add_sysctls(adapter_t *sc) +t3_add_attach_sysctls(adapter_t *sc) { struct sysctl_ctx_list *ctx; struct sysctl_oid_list *children; - + ctx = device_get_sysctl_ctx(sc->dev); children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); @@ -2740,11 +2740,6 @@ 0, t3_lro_enable, "I", "enable large receive offload"); - SYSCTL_ADD_PROC(ctx, children, OID_AUTO, - "intr_coal", - CTLTYPE_INT|CTLFLAG_RW, sc, - 0, t3_set_coalesce_nsecs, - "I", "interrupt coalescing timer (ns)"); SYSCTL_ADD_INT(ctx, children, OID_AUTO, "enable_debug", CTLFLAG_RW, &cxgb_debug, @@ -2770,8 +2765,76 @@ "bogus_imm", CTLFLAG_RD, &bogus_imm, 0, "#times a bogus immediate response was seen"); + } +void +t3_add_configured_sysctls(adapter_t *sc) +{ + struct sysctl_ctx_list *ctx; + struct sysctl_oid_list *children; + int i, j; + + ctx = device_get_sysctl_ctx(sc->dev); + children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)); + + SYSCTL_ADD_PROC(ctx, children, OID_AUTO, + "intr_coal", + CTLTYPE_INT|CTLFLAG_RW, sc, + 0, t3_set_coalesce_nsecs, + "I", "interrupt coalescing timer (ns)"); + + for (i = 0; i < sc->params.nports; i++) { + struct port_info *pi = &sc->port[i]; + struct sysctl_oid *poid; + struct sysctl_oid_list *poidlist; + + snprintf(pi->namebuf, PORT_NAME_LEN, "port%d", i); + poid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, + pi->namebuf, CTLFLAG_RD, NULL, "port statistics"); + poidlist = SYSCTL_CHILDREN(poid); + SYSCTL_ADD_INT(ctx, poidlist, OID_AUTO, + "nqsets", CTLFLAG_RD, &pi->nqsets, + 0, "#queue sets"); + + for (j = 0; j < pi->nqsets; j++) { + struct sge_qset *qs = &sc->sge.qs[pi->first_qset + j]; + struct sysctl_oid *qspoid; + struct sysctl_oid_list *qspoidlist; + struct sge_txq *txq = &qs->txq[TXQ_ETH]; + + snprintf(qs->namebuf, QS_NAME_LEN, "qs%d", j); + + qspoid = SYSCTL_ADD_NODE(ctx, poidlist, OID_AUTO, + qs->namebuf, CTLFLAG_RD, NULL, "qset statistics"); + qspoidlist = SYSCTL_CHILDREN(qspoid); + + SYSCTL_ADD_INT(ctx, qspoidlist, OID_AUTO, "dropped", + CTLFLAG_RD, &qs->txq[TXQ_ETH].txq_drops, + 0, "#tunneled packets dropped"); + SYSCTL_ADD_INT(ctx, qspoidlist, OID_AUTO, "sendqlen", + CTLFLAG_RD, &qs->txq[TXQ_ETH].sendq.qlen, + 0, "#tunneled packets waiting to be sent"); + SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "queue_pidx", + CTLFLAG_RD, (uint32_t *)(uintptr_t)&qs->txq[TXQ_ETH].txq_mr.mr_prod, + 0, "#tunneled packets queue producer index"); + SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "queue_cidx", + CTLFLAG_RD, (uint32_t *)(uintptr_t)&qs->txq[TXQ_ETH].txq_mr.mr_cons, + 0, "#tunneled packets queue consumer index"); + SYSCTL_ADD_INT(ctx, qspoidlist, OID_AUTO, "processed", + CTLFLAG_RD, &qs->txq[TXQ_ETH].processed, + 0, "#tunneled packets processed by the card"); + SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "cleaned", + CTLFLAG_RD, &txq->cleaned, + 0, "#tunneled packets cleaned"); + SYSCTL_ADD_UINT(ctx, qspoidlist, OID_AUTO, "in_use", + CTLFLAG_RD, &txq->in_use, + 0, "#tunneled packet slots in use"); + + } + } +} + /** * t3_get_desc - dump an SGE descriptor for debugging purposes * @qs: the queue set