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