PERFORCE change 124928 for review
Kip Macy
kmacy at FreeBSD.org
Wed Aug 8 17:54:59 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=124928
Change 124928 by kmacy at kmacy_home:ethng on 2007/08/09 00:54:45
get cxgb support for IFNET_MULTIQUEUE performance
within 10% of default case
Affected files ...
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#6 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#9 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#4 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#7 edit
Differences ...
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#6 (text+ko) ====
@@ -51,6 +51,7 @@
#include <machine/bus.h>
#include <machine/resource.h>
+
#include <sys/bus_dma.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
@@ -584,5 +585,6 @@
int cxgb_tx_common(struct ifnet *ifp, struct sge_qset *qs, uint32_t txmax);
struct mbuf *cxgb_dequeue_packet(struct ifnet *ifp, struct sge_txq *unused);
void cxgb_start(struct ifnet *ifp);
+void refill_fl_service(adapter_t *adap, struct sge_fl *fl);
#endif
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#9 (text+ko) ====
@@ -1961,7 +1961,7 @@
break;
BPF_MTAP(ifp, m);
}
-#ifdef IFNET_MULTIQUEUE
+#ifndef IFNET_MULTIQUEUE
if (__predict_false(err)) {
if (err == ENOMEM) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
@@ -1970,8 +1970,9 @@
IFQ_UNLOCK(&ifp->if_snd);
}
}
- if (err == 0 && m == NULL)
+ if (err == 0 && m == NULL) {
err = ENOBUFS;
+ }
else if ((err == 0) && (txq->size <= txq->in_use + TX_MAX_DESC) &&
(ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
ifp->if_drv_flags |= IFF_DRV_OACTIVE;
@@ -1992,9 +1993,9 @@
if (!p->link_config.link_ok)
return (ENXIO);
- if (IFQ_DRV_IS_EMPTY(&ifp->if_snd))
+ if (IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
return (ENOBUFS);
-
+ }
qs = &p->adapter->sge.qs[p->first_qset];
txq = &qs->txq[TXQ_ETH];
err = 0;
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#4 (text+ko) ====
@@ -1,5 +1,3 @@
-
-
/**************************************************************************
Copyright (c) 2007, Chelsio Inc.
@@ -149,6 +147,9 @@
}
mtx_unlock(&txq->lock);
+ if ((qs->txq[TXQ_ETH].flags & TXQ_TRANSMITTING) == 0)
+ wakeup(qs);
+
if (dropped)
m_freem(m);
}
@@ -566,8 +567,6 @@
sched_unpin();
}
-void refill_fl_service(adapter_t *adap, struct sge_fl *fl);
-
static void
cxgb_pcpu_start_proc(void *arg)
{
@@ -589,7 +588,7 @@
refill_fl_service(qs->port->adapter, &qs->fl[0]);
refill_fl_service(qs->port->adapter, &qs->fl[1]);
- tsleep(qs, 0, "cxgbidle", sleep_ticks);
+ tsleep(qs, 1, "cxgbidle", sleep_ticks);
}
thread_lock(td);
sched_unbind(td);
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#7 (text+ko) ====
@@ -188,7 +188,6 @@
static void sge_timer_cb(void *arg);
static void sge_timer_reclaim(void *arg, int ncount);
static void sge_txq_reclaim_handler(void *arg, int ncount);
-static int free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec);
/**
* reclaim_completed_tx - reclaims completed Tx descriptors
@@ -207,7 +206,7 @@
mtx_assert(&q->lock, MA_OWNED);
if (reclaim > 0) {
- n = free_tx_desc(q, min(reclaim, nbufs), mvec);
+ n = t3_free_tx_desc(q, min(reclaim, nbufs), mvec);
reclaimed = min(reclaim, nbufs);
q->cleaned += reclaimed;
q->in_use -= reclaimed;
@@ -580,6 +579,13 @@
refill_fl(adap, fl, min(16U, fl->size - fl->credits));
}
+void
+refill_fl_service(adapter_t *adap, struct sge_fl *fl)
+{
+ return; /* XXX no-op for now */
+ __refill_fl(adap, fl);
+}
+
/**
* recycle_rx_buf - recycle a receive buffer
* @adapter: the adapter
@@ -1654,7 +1660,7 @@
/**
- * free_tx_desc - reclaims Tx descriptors and their buffers
+ * t3_free_tx_desc - reclaims Tx descriptors and their buffers
* @adapter: the adapter
* @q: the Tx queue to reclaim descriptors from
* @n: the number of descriptors to reclaim
@@ -1663,7 +1669,7 @@
* Tx buffers. Called with the Tx queue lock held.
*/
int
-free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec)
+t3_free_tx_desc(struct sge_txq *q, int n, struct mbuf **m_vec)
{
struct tx_sw_desc *d;
unsigned int cidx = q->cidx;
@@ -2226,9 +2232,12 @@
struct ifnet *ifp = pi->ifp;
DPRINTF("rx_eth m=%p m->m_data=%p p->iff=%d\n", m, mtod(m, uint8_t *), cpl->iff);
- if (&pi->adapter->port[cpl->iff] != pi)
- panic("bad port index %d m->m_data=%p\n", cpl->iff, mtod(m, uint8_t *));
-
+ if (&pi->adapter->port[cpl->iff] != pi) {
+ struct sge_qset *qs = rspq_to_qset(rq);
+
+ panic("bad port index %d m->m_data=%p cidx=%d pidx=%d\n", cpl->iff, mtod(m, uint8_t *),
+ qs->fl[0].cidx, qs->fl[0].pidx);
+ }
if ((ifp->if_capenable & IFCAP_RXCSUM) && !cpl->fragment &&
cpl->csum_valid && cpl->csum == 0xffff) {
m->m_pkthdr.csum_flags = (CSUM_IP_CHECKED|CSUM_IP_VALID);
More information about the p4-projects
mailing list