From owner-p4-projects@FreeBSD.ORG Tue Aug 21 00:41:43 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 479E116A468; Tue, 21 Aug 2007 00:41:43 +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 0854216A41B for ; Tue, 21 Aug 2007 00:41:43 +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 ECBE013C4A5 for ; Tue, 21 Aug 2007 00:41:42 +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 l7L0fgaI015744 for ; Tue, 21 Aug 2007 00:41:42 GMT (envelope-from kmacy@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l7L0fgdJ015741 for perforce@freebsd.org; Tue, 21 Aug 2007 00:41:42 GMT (envelope-from kmacy@freebsd.org) Date: Tue, 21 Aug 2007 00:41:42 GMT Message-Id: <200708210041.l7L0fgdJ015741@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 125472 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 00:41:43 -0000 http://perforce.freebsd.org/chv.cgi?CH=125472 Change 125472 by kmacy@kmacy_home:ethng on 2007/08/21 00:41:07 - switch tx software descriptor over to using an mbuf array with a count - make dequeue_packet check for TSO so that TSO packets are handled separately - change most tx sd local variable names to txsd Affected files ... .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#12 edit .. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#14 edit Differences ... ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#12 (text+ko) ==== @@ -183,23 +183,24 @@ if (qs->qs_flags & QS_EXITING) return (NULL); - critical_enter(); for (head = m = mbufq_dequeue(mbq); m != NULL; m = mbufq_dequeue(mbq)) { - /* XXXX debug */ - break; - size += m->m_pkthdr.len; count++; if (tail) tail->m_nextpkt = m; - if (count == 7 || size + mbufq_head_size(mbq) > 11*1024 || cxgb_pcpu_tx_coalesce == 0) + 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) + break; } - critical_exit(); return (head); } ==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#14 (text+ko) ==== @@ -133,7 +133,8 @@ #define RSPQ_SOP_EOP G_RSPD_SOP_EOP(F_RSPD_SOP|F_RSPD_EOP) struct tx_sw_desc { /* SW state per Tx descriptor */ - struct mbuf *m; + struct mbuf *m[TX_WR_COUNT_MAX]; + int count; bus_dmamap_t map; int flags; }; @@ -965,7 +966,7 @@ static unsigned int busdma_map_mbufs(struct mbuf **m, struct sge_txq *txq, - struct tx_sw_desc *stx, bus_dma_segment_t *segs, int *nsegs) + struct tx_sw_desc *txsd, bus_dma_segment_t *segs, int *nsegs) { struct mbuf *m0; int err, pktlen; @@ -973,7 +974,7 @@ m0 = *m; pktlen = m0->m_pkthdr.len; - err = bus_dmamap_load_mvec_sg(txq->entry_tag, stx->map, m0, segs, nsegs, 0); + err = bus_dmamap_load_mvec_sg(txq->entry_tag, txsd->map, m0, segs, nsegs, 0); #ifdef DEBUG if (err) { int n = 0; @@ -995,7 +996,7 @@ return (ENOBUFS); } *m = m0; - err = bus_dmamap_load_mbuf_sg(txq->entry_tag, stx->map, m0, segs, nsegs, 0); + err = bus_dmamap_load_mbuf_sg(txq->entry_tag, txsd->map, m0, segs, nsegs, 0); } if (err == ENOMEM) { @@ -1010,8 +1011,8 @@ return (err); } - bus_dmamap_sync(txq->entry_tag, stx->map, BUS_DMASYNC_PREWRITE); - stx->flags |= TX_SW_DESC_MAPPED; + bus_dmamap_sync(txq->entry_tag, txsd->map, BUS_DMASYNC_PREWRITE); + txsd->flags |= TX_SW_DESC_MAPPED; return (0); } @@ -1155,7 +1156,8 @@ * is freed all clusters will be freed * with it */ - txsd->m = NULL; + txsd->m[0] = NULL; + txsd->count = 0; wrp = (struct work_request_hdr *)txd; wrp->wr_hi = htonl(V_WR_DATATYPE(1) | V_WR_SGLSFLT(1)) | wr_hi; @@ -1267,7 +1269,8 @@ if (mlen <= WR_LEN - sizeof(*cpl)) { txq_prod(txq, 1, &txqs); - txq->sdesc[txqs.pidx].m = m0; + txq->sdesc[txqs.pidx].m[0] = m0; + txq->sdesc[txqs.pidx].count = 1; m_set_priority(m0, txqs.pidx); if (m0->m_len == m0->m_pkthdr.len) @@ -1308,7 +1311,8 @@ txsd = &txq->sdesc[txqs.pidx]; wr_hi = htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl); wr_lo = htonl(V_WR_TID(txq->token)); - txsd->m = m0; + txsd->m[0] = m0; + txsd->count = 1; m_set_priority(m0, txqs.pidx); write_wr_hdr_sgl(ndesc, txd, &txqs, txq, sgl, flits, sgl_flits, wr_hi, wr_lo); @@ -1675,7 +1679,7 @@ int t3_free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec) { - struct tx_sw_desc *d; + struct tx_sw_desc *txsd; unsigned int cidx; int nbufs = 0; @@ -1684,29 +1688,30 @@ "reclaiming %u Tx descriptors at cidx %u", n, cidx); #endif cidx = q->cidx; - d = &q->sdesc[cidx]; + txsd = &q->sdesc[cidx]; while (n-- > 0) { DPRINTF("cidx=%d d=%p\n", cidx, d); - if (d->m) { - if (d->flags & TX_SW_DESC_MAPPED) { - bus_dmamap_unload(q->entry_tag, d->map); - d->flags &= ~TX_SW_DESC_MAPPED; + if (txsd->count > 0) { + if (txsd->flags & TX_SW_DESC_MAPPED) { + bus_dmamap_unload(q->entry_tag, txsd->map); + txsd->flags &= ~TX_SW_DESC_MAPPED; } - if (m_get_priority(d->m) == cidx) { - m_vec[nbufs] = d->m; - d->m = NULL; + if (m_get_priority(txsd->m[0]) == cidx) { + m_vec[nbufs] = txsd->m[0]; + txsd->m[0] = NULL; + txsd->count = 0; nbufs++; } else { - printf("pri=%d cidx=%d\n", (int)m_get_priority(d->m), cidx); + printf("pri=%d cidx=%d\n", (int)m_get_priority(txsd->m[0]), cidx); } } else q->txq_skipped++; - ++d; + ++txsd; if (++cidx == q->size) { cidx = 0; - d = q->sdesc; + txsd = q->sdesc; } } q->cidx = cidx; @@ -1763,7 +1768,8 @@ struct txq_state txqs; if (immediate(m)) { - q->sdesc[pidx].m = NULL; + q->sdesc[pidx].m[0] = NULL; + q->sdesc[pidx].count = 0; write_imm(d, m, m->m_len, gen); return; }