PERFORCE change 125472 for review
Kip Macy
kmacy at FreeBSD.org
Mon Aug 20 17:41:43 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125472
Change 125472 by kmacy at 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;
}
More information about the p4-projects
mailing list