From owner-p4-projects@FreeBSD.ORG Tue Aug 21 01:34:50 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6FF6316A46D; Tue, 21 Aug 2007 01:34:50 +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 2609616A419 for ; Tue, 21 Aug 2007 01:34:50 +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 15C0313C47E for ; Tue, 21 Aug 2007 01:34:50 +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 l7L1YnaX028379 for ; Tue, 21 Aug 2007 01:34:49 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7L1YnZe028374 for perforce@freebsd.org; Tue, 21 Aug 2007 01:34:49 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 21 Aug 2007 01:34:49 GMT Message-Id: <200708210134.l7L1YnZe028374@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 125475 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: Tue, 21 Aug 2007 01:34:50 -0000 http://perforce.freebsd.org/chv.cgi?CH=125475 Change 125475 by kmacy@kmacy_home:ethng on 2007/08/21 01:34:19 - track number of coalesced packets - make dequeue_packet and t3_encap take an array of mbufs and return / take a count - remove m_sanity call - free packet in multi-queue case if we hit ENOMEM Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#11 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#13 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#13 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#15 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#11 (text+ko) ==== @@ -273,6 +273,7 @@ struct mbuf_ring txq_mr; uint32_t txq_drops; uint32_t txq_skipped; + uint32_t txq_coalesced; unsigned long txq_frees; struct mtx lock; #define TXQ_NAME_LEN 32 @@ -523,7 +524,7 @@ void t3b_intr(void *data); void t3_intr_msi(void *data); void t3_intr_msix(void *data); -int t3_encap(struct sge_qset *, struct mbuf **); +int t3_encap(struct sge_qset *, struct mbuf **, int); int t3_sge_init_adapter(adapter_t *); int t3_sge_init_port(struct port_info *); @@ -590,7 +591,7 @@ #endif void t3_free_qset(adapter_t *sc, struct sge_qset *q); -struct mbuf *cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused); +int cxgb_dequeue_packet(struct ifnet *, struct sge_txq *, struct mbuf **); void cxgb_start(struct ifnet *ifp); void refill_fl_service(adapter_t *adap, struct sge_fl *fl); ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#13 (text+ko) ==== @@ -1929,35 +1929,23 @@ cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax) { struct sge_txq *txq; - struct mbuf *m0, *m = NULL; - int err, in_use_init; - + int err, in_use_init, count, i; + struct mbuf *m_vec[TX_WR_COUNT_MAX]; + txq = &qs->txq[TXQ_ETH]; in_use_init = txq->in_use; err = 0; while ((txq->in_use - in_use_init < txmax) && (txq->size > txq->in_use + TX_MAX_DESC)) { - m = cxgb_dequeue_packet(ifp, txq); - if (m == NULL) + count = cxgb_dequeue_packet(ifp, txq, m_vec); + if (count == 0) break; +#ifdef notyet /* * Convert chain to M_IOVEC */ KASSERT((m->m_flags & M_IOVEC) == 0, ("IOVEC set too early")); m0 = m; -#ifdef INVARIANTS - /* - * Clean up after net stack sloppiness - * before calling m_sanity - */ - m0 = m->m_next; - while (m0) { - m0->m_flags &= ~M_PKTHDR; - m0 = m0->m_next; - } - m_sanity(m0, 0); - m0 = m; -#endif if (collapse_mbufs && m->m_pkthdr.len > MCLBYTES && m_collapse(m, TX_MAX_SEGS, &m0) == EFBIG) { if ((m0 = m_defrag(m, M_NOWAIT)) != NULL) { @@ -1967,9 +1955,11 @@ break; } m = m0; - if ((err = t3_encap(qs, &m)) != 0) +#endif + if ((err = t3_encap(qs, m_vec, count)) != 0) break; - BPF_MTAP(ifp, m); + for (i = 0; i < count; i++) + BPF_MTAP(ifp, m_vec[i]); } #ifndef IFNET_MULTIQUEUE if (__predict_false(err)) { @@ -1993,6 +1983,13 @@ err = ENOSPC; setbit(&qs->txq_stopped, TXQ_ETH); } + if (err == ENOMEM) { + /* + * Sub-optimal :-/ + */ + for (i = 0; i < count; i++) + m_freem(m_vec[i]); + } #endif return (err); } @@ -2048,13 +2045,12 @@ } while (error == 0); } -struct mbuf * -cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused) +int +cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused, struct mbuf **m_vec) { - struct mbuf *m; - - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); - return (m); + + IFQ_DRV_DEQUEUE(&ifp->if_snd, m_vec[0]); + return (m_vec[0] ? 1 : 0); } void ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#13 (text+ko) ==== @@ -167,42 +167,40 @@ return (err); } -struct mbuf * -cxgb_dequeue_packet(struct ifnet *unused, struct sge_txq *txq) +int +cxgb_dequeue_packet(struct ifnet *unused, struct sge_txq *txq, struct mbuf **m_vec) { - struct mbuf *m, *tail, *head; + struct mbuf *m; struct sge_qset *qs; - int count, size; + int count, size, coalesced; struct mbuf_head *mbq; mbq = &txq->sendq; - count = size = 0; - tail = NULL; + coalesced = count = size = 0; qs = txq_to_qset(txq, TXQ_ETH); if (qs->qs_flags & QS_EXITING) - return (NULL); + return (0); - for (head = m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) { + for (m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) { size += m->m_pkthdr.len; - count++; - - if (tail) - tail->m_nextpkt = m; + m_vec[count++] = m; if (count == TX_WR_COUNT_MAX || cxgb_pcpu_tx_coalesce == 0) break; - tail = m; m = mbufq_peek(mbq); /* * We can't coalesce TSO packets or past 11K */ - if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX) + if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL) break; + + coalesced++; } - - return (head); + txq->txq_coalesced += coalesced; + + return (count); } int32_t ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#15 (text+ko) ==== @@ -1179,7 +1179,7 @@ #define TCPPKTHDRSIZE (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + 20 + 20) int -t3_encap(struct sge_qset *qs, struct mbuf **m) +t3_encap(struct sge_qset *qs, struct mbuf **m, int count) { adapter_t *sc; struct mbuf *m0;