PERFORCE change 127849 for review
Kip Macy
kmacy at FreeBSD.org
Sat Oct 20 15:03:12 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=127849
Change 127849 by kmacy at kmacy_home:ethng on 2007/10/20 22:02:10
make mbuf ring a generic ring buffer for pointers
Affected files ...
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#25 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#27 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#25 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_osdep.h#15 edit
.. //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#34 edit
Differences ...
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_adapter.h#25 (text+ko) ====
@@ -276,11 +276,11 @@
bus_dma_tag_t entry_tag;
struct mbuf_head sendq;
/*
- * cleanq should really be an mbuf_ring to avoid extra
+ * cleanq should really be an buf_ring to avoid extra
* mbuf touches
*/
struct mbuf_head cleanq;
- struct mbuf_ring txq_mr;
+ struct buf_ring txq_mr;
struct mbuf *immpkt;
uint32_t txq_drops;
uint32_t txq_skipped;
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_main.c#27 (text+ko) ====
@@ -221,7 +221,7 @@
"use a single queue-set per port");
#ifndef IFNET_MULTIQUEUE
-int cxgb_txq_mbuf_ring_size = 0;
+int cxgb_txq_buf_ring_size = 0;
#endif
enum {
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_multiq.c#25 (text+ko) ====
@@ -103,9 +103,9 @@
SYSCTL_UINT(_hw_cxgb, OID_AUTO, sleep_ticks, CTLFLAG_RDTUN, &sleep_ticks, 0,
"ticks to sleep between checking pcpu queues");
-int cxgb_txq_mbuf_ring_size = TX_ETH_Q_SIZE;
-TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb_txq_mbuf_ring_size);
-SYSCTL_UINT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_mbuf_ring_size, 0,
+int cxgb_txq_buf_ring_size = TX_ETH_Q_SIZE;
+TUNABLE_INT("hw.cxgb.txq_mr_size", &cxgb_txq_buf_ring_size);
+SYSCTL_UINT(_hw_cxgb, OID_AUTO, txq_mr_size, CTLFLAG_RDTUN, &cxgb_txq_buf_ring_size, 0,
"size of per-queue mbuf ring");
@@ -117,7 +117,7 @@
cxgb_pcpu_enqueue_packet_(struct sge_qset *qs, struct mbuf *m)
{
struct sge_txq *txq;
- struct mbuf_ring *mr;
+ struct buf_ring *mr;
int prod, cons, mask;
int err = 0;
@@ -133,9 +133,9 @@
prod = mr->mr_prod;
mask = mr->mr_size - 1;
if (((prod + 1) & mask) != cons) {
- mr->mr_ring[prod] = m;
+ mr->mr_ring[prod] = (caddr_t)m;
+ mb();
mr->mr_prod = (prod + 1) & mask;
- mb();
} else {
txq->txq_drops++;
err = ENOBUFS;
@@ -176,7 +176,7 @@
struct sge_qset *qs;
int count, size, coalesced;
struct adapter *sc;
- struct mbuf_ring *mr;
+ struct buf_ring *mr;
mr = &txq->txq_mr;
coalesced = count = size = 0;
@@ -193,7 +193,7 @@
}
sc = qs->port->adapter;
- m = mbuf_ring_dequeue(mr);
+ m = buf_ring_dequeue(mr);
if (m == NULL)
return (0);
@@ -204,12 +204,12 @@
}
count = 1;
size = m->m_pkthdr.len;
- for (m = mbuf_ring_peek(mr); m != NULL; m = mbuf_ring_peek(mr)) {
+ for (m = buf_ring_peek(mr); m != NULL; m = buf_ring_peek(mr)) {
if (m->m_pkthdr.tso_segsz > 0 || size + m->m_pkthdr.len > TX_WR_SIZE_MAX || m->m_next != NULL)
break;
- mbuf_ring_dequeue(mr);
+ buf_ring_dequeue(mr);
size += m->m_pkthdr.len;
m_vec[count++] = m;
@@ -360,7 +360,7 @@
while ((m = mbufq_dequeue(&txq->sendq)) != NULL)
m_freem(m);
- while ((m = mbuf_ring_dequeue(&txq->txq_mr)) != NULL)
+ while ((m = buf_ring_dequeue(&txq->txq_mr)) != NULL)
m_freem(m);
t3_free_tx_desc_all(txq);
@@ -412,7 +412,7 @@
else {
txq = &qs->txq[TXQ_ETH];
- if (!mbuf_ring_empty(&txq->txq_mr))
+ if (!buf_ring_empty(&txq->txq_mr))
initerr = cxgb_pcpu_enqueue_packet_(qs, immpkt);
else
txq->immpkt = immpkt;
@@ -442,11 +442,11 @@
}
stopped = isset(&qs->txq_stopped, TXQ_ETH);
- flush = ((!mbuf_ring_empty(&txq->txq_mr) && !stopped) || txq->immpkt);
+ flush = ((!buf_ring_empty(&txq->txq_mr) && !stopped) || txq->immpkt);
max_desc = tx_flush ? TX_ETH_Q_SIZE : TX_START_MAX_DESC;
err = flush ? cxgb_tx_common(qs->port->ifp, qs, max_desc) : ENOSPC;
- if ((tx_flush && flush && err == 0) && !mbuf_ring_empty(&txq->txq_mr)) {
+ if ((tx_flush && flush && err == 0) && !buf_ring_empty(&txq->txq_mr)) {
struct thread *td = curthread;
if (++i > 1) {
@@ -492,11 +492,11 @@
txq = &qs->txq[TXQ_ETH];
- if (((sc->tunq_coalesce == 0) || (mbuf_ring_count(&txq->txq_mr) > TX_WR_COUNT_MAX)) && mtx_trylock(&txq->lock)) {
+ if (((sc->tunq_coalesce == 0) || (buf_ring_count(&txq->txq_mr) > TX_WR_COUNT_MAX)) && mtx_trylock(&txq->lock)) {
txq->flags |= TXQ_TRANSMITTING;
err = cxgb_pcpu_start_(qs, immpkt, FALSE);
txq->flags &= ~TXQ_TRANSMITTING;
- resid = (mbuf_ring_count(&txq->txq_mr) > 64) || (desc_reclaimable(txq) > 64);
+ resid = (buf_ring_count(&txq->txq_mr) > 64) || (desc_reclaimable(txq) > 64);
mtx_unlock(&txq->lock);
} else if (immpkt)
err = cxgb_pcpu_enqueue_packet_(qs, immpkt);
@@ -586,7 +586,7 @@
if ((qs->port->ifp->if_drv_flags && IFF_DRV_RUNNING) == 0) {
idleticks = hz;
- if (!mbuf_ring_empty(&txq->txq_mr) ||
+ if (!buf_ring_empty(&txq->txq_mr) ||
!mbufq_empty(&txq->sendq))
cxgb_pcpu_free(qs);
goto done;
@@ -610,7 +610,7 @@
mtx_unlock(&qs->rspq.lock);
}
- if ((!mbuf_ring_empty(&txq->txq_mr)) && err == 0) {
+ if ((!buf_ring_empty(&txq->txq_mr)) && err == 0) {
if (cxgb_debug)
printf("head=%p cons=%d prod=%d\n",
txq->sendq.head, txq->txq_mr.mr_cons,
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_osdep.h#15 (text+ko) ====
@@ -161,8 +161,8 @@
#define L1_CACHE_BYTES 32
#endif
-struct mbuf_ring {
- struct mbuf **mr_ring;
+struct buf_ring {
+ caddr_t *mr_ring;
volatile uint32_t mr_cons;
volatile uint32_t mr_prod;
int mr_size;
@@ -170,7 +170,7 @@
};
static __inline int
-mbuf_ring_count(struct mbuf_ring *mr)
+buf_ring_count(struct buf_ring *mr)
{
int size = mr->mr_size;
int mask = size - 1;
@@ -179,18 +179,23 @@
}
static __inline int
-mbuf_ring_empty(struct mbuf_ring *mr)
+buf_ring_empty(struct buf_ring *mr)
{
return (mr->mr_cons == mr->mr_prod);
}
-static __inline struct mbuf *
-mbuf_ring_dequeue(struct mbuf_ring *mr)
+/*
+ * The producer and consumer are independently locked
+ * this relies on the consumer providing his own serialization
+ *
+ */
+static __inline void *
+buf_ring_dequeue(struct buf_ring *mr)
{
int prod, cons, mask;
- struct mbuf **ring, *m;
+ caddr_t *ring, m;
- ring = mr->mr_ring;
+ ring = (caddr_t *)mr->mr_ring;
mask = mr->mr_size - 1;
cons = mr->mr_cons;
prod = mr->mr_prod;
@@ -200,17 +205,49 @@
mr->mr_cons = (cons + 1) & mask;
mb();
}
+ return (m);
+}
+
- return (m);
+static __inline int
+__buf_ring_enqueue(struct buf_ring *mr, void *m)
+{
+
+ int prod, cons, mask, err;
+
+ cons = mr->mr_cons;
+ prod = mr->mr_prod;
+ mask = mr->mr_size - 1;
+ if (((prod + 1) & mask) != cons) {
+ mr->mr_ring[prod] = m;
+ mb();
+ mr->mr_prod = (prod + 1) & mask;
+ err = 0;
+ } else
+ err = ENOBUFS;
+
+ return (err);
+}
+
+static __inline int
+buf_ring_enqueue(struct buf_ring *mr, void *m)
+{
+ int err;
+
+ mtx_lock(&mr->mr_lock);
+ err = __buf_ring_enqueue(mr, m);
+ mtx_unlock(&mr->mr_lock);
+
+ return (err);
}
-static __inline struct mbuf *
-mbuf_ring_peek(struct mbuf_ring *mr)
+static __inline void *
+buf_ring_peek(struct buf_ring *mr)
{
int prod, cons, mask;
- struct mbuf **ring, *m;
+ caddr_t *ring, m;
- ring = mr->mr_ring;
+ ring = (caddr_t *)mr->mr_ring;
mask = mr->mr_size - 1;
cons = mr->mr_cons;
prod = mr->mr_prod;
==== //depot/projects/ethng/src/sys/dev/cxgb/cxgb_sge.c#34 (text+ko) ====
@@ -74,7 +74,7 @@
#ifndef DISABLE_MBUF_IOVEC
static int recycle_enable = 1;
#endif
-extern int cxgb_txq_mbuf_ring_size;
+extern int cxgb_txq_buf_ring_size;
int cxgb_cached_allocations;
int cxgb_cached;
int cxgb_ext_freed;
@@ -2259,13 +2259,13 @@
int i, ret = 0;
for (i = 0; i < SGE_TXQ_PER_SET; i++) {
- if ((q->txq[i].txq_mr.mr_ring = malloc(cxgb_txq_mbuf_ring_size*sizeof(struct mbuf *),
+ if ((q->txq[i].txq_mr.mr_ring = malloc(cxgb_txq_buf_ring_size*sizeof(struct mbuf *),
M_DEVBUF, M_WAITOK|M_ZERO)) == NULL) {
device_printf(sc->dev, "failed to allocate mbuf ring\n");
goto err;
}
q->txq[i].txq_mr.mr_prod = q->txq[i].txq_mr.mr_cons = 0;
- q->txq[i].txq_mr.mr_size = cxgb_txq_mbuf_ring_size;
+ q->txq[i].txq_mr.mr_size = cxgb_txq_buf_ring_size;
mtx_init(&q->txq[i].txq_mr.mr_lock, "txq mbuf ring", NULL, MTX_DEF);
}
More information about the p4-projects
mailing list