svn commit: r193476 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb
Kip Macy
kmacy at FreeBSD.org
Fri Jun 5 00:05:26 UTC 2009
Author: kmacy
Date: Fri Jun 5 00:05:25 2009
New Revision: 193476
URL: http://svn.freebsd.org/changeset/base/193476
Log:
- remove inet specific bits along with extra locking
- add packet coalescing when the transmit ring starts to fill up
Modified:
user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c
user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c
Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c Thu Jun 4 23:43:08 2009 (r193475)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_main.c Fri Jun 5 00:05:25 2009 (r193476)
@@ -2086,7 +2086,6 @@ static int
cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
{
struct port_info *p = ifp->if_softc;
- struct ifaddr *ifa = (struct ifaddr *)data;
struct ifreq *ifr = (struct ifreq *)data;
int flags, error = 0, reinit = 0;
uint32_t mask;
@@ -2099,7 +2098,6 @@ cxgb_ioctl(struct ifnet *ifp, unsigned l
error = cxgb_set_mtu(p, ifr->ifr_mtu);
break;
case SIOCSIFFLAGS:
- PORT_LOCK(p);
if (ifp->if_flags & IFF_UP) {
if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
flags = p->if_flags;
@@ -2107,14 +2105,15 @@ cxgb_ioctl(struct ifnet *ifp, unsigned l
((ifp->if_flags ^ flags) & IFF_ALLMULTI))
cxgb_set_rxmode(p);
} else {
- PORT_UNLOCK(p);
- cxgb_init_locked(p);
- PORT_LOCK(p);
+ cxgb_init(p);
}
p->if_flags = ifp->if_flags;
- } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ PORT_LOCK(p);
cxgb_stop_locked(p);
- PORT_UNLOCK(p);
+ PORT_UNLOCK(p);
+ }
+
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Thu Jun 4 23:43:08 2009 (r193475)
+++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Fri Jun 5 00:05:25 2009 (r193476)
@@ -203,7 +203,10 @@ static uint8_t flit_desc_map[] = {
#define TXQ_LOCK(qs) mtx_lock(&(qs)->lock)
#define TXQ_UNLOCK(qs) mtx_unlock(&(qs)->lock)
#define TXQ_RING_EMPTY(qs) drbr_empty((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr)
-#define TXQ_RING_DEQUEUE(qs) drbr_dequeue((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr)
+#define TXQ_RING_DEQUEUE_COND(qs, func, arg) \
+ drbr_dequeue_cond((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr, func, arg)
+#define TXQ_RING_DEQUEUE(qs) \
+ drbr_dequeue((qs)->port->ifp, (qs)->txq[TXQ_ETH].txq_mr)
#define CXGB_TX_TIMEOUT 5
int cxgb_debug = 0;
@@ -212,6 +215,22 @@ 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 __inline void
+check_pkt_coalesce(struct sge_qset *qs)
+{
+ struct adapter *sc;
+ struct sge_txq *txq;
+
+ txq = &qs->txq[TXQ_ETH];
+ sc = qs->port->adapter;
+
+ if (sc->tunq_fill[qs->idx] && (txq->in_use < (txq->size - (txq->size>>2))))
+ sc->tunq_fill[qs->idx] = 0;
+ else if (!sc->tunq_fill[qs->idx] && (txq->in_use > (txq->size - (txq->size>>2))))
+ sc->tunq_fill[qs->idx] = 1;
+}
+
#ifdef __LP64__
static void
set_wr_hdr(struct work_request_hdr *wrp, uint32_t wr_hi, uint32_t wr_lo)
@@ -1459,22 +1478,57 @@ t3_encap(struct sge_qset *qs, struct mbu
return (0);
}
+static int
+coalesce_check(struct mbuf *m, void *arg)
+{
+ uintptr_t *nbytes = (uintptr_t *)arg;
+
+ if (*nbytes == 0)
+ return (1);
+ else if (m->m_next != NULL)
+ return (0);
+ else if (*nbytes + m->m_len <= 10500) {
+ *nbytes += m->m_len;
+ return (1);
+ }
+
+ return (0);
+}
+
static void
cxgb_start_locked(struct sge_qset *qs)
{
- struct mbuf *m_head = NULL;
+ struct mbuf *m, *m_tail, *m_head = NULL;
int txmax = TX_START_MAX_DESC;
struct sge_txq *txq = &qs->txq[TXQ_ETH];
int in_use_init = txq->in_use;
struct port_info *pi = qs->port;
+ struct adapter *sc = pi->adapter;
struct ifnet *ifp = pi->ifp;
- int count = 1;
+ int count, nbytes;
TXQ_LOCK_ASSERT(qs);
while ((txq->in_use - in_use_init < txmax) &&
(!TXQ_RING_EMPTY(qs))) {
+ m_head = m_tail = NULL;
+ check_pkt_coalesce(qs);
+ count = 1;
+
+ if (sc->tunq_coalesce) {
+ nbytes = 0;
+ do {
+ m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &nbytes);
+ if (m_head == NULL) {
+ m_tail = m_head = m;
+ } else if (m != NULL) {
+ count++;
+ m_tail->m_nextpkt = m;
+ m_tail = m;
+ }
+ } while (m != NULL);
+ } else
+ m_head = TXQ_RING_DEQUEUE(qs);
- m_head = TXQ_RING_DEQUEUE(qs);
if (m_head == NULL)
break;
/*
@@ -1511,12 +1565,10 @@ cxgb_transmit_locked(struct ifnet *ifp,
int error, count = 1;
TXQ_LOCK_ASSERT(qs);
- reclaim_completed_tx(qs, (TX_ETH_Q_SIZE>>3), TXQ_ETH);
+ reclaim_completed_tx(qs, (TX_ETH_Q_SIZE>>4), TXQ_ETH);
- if ((!pi->link_config.link_ok) /* check others */) {
- error = drbr_enqueue(ifp, br, m);
- return (error);
- } else if (TXQ_RING_EMPTY(qs) && sc->tunq_coalesce == 0) {
+ if (sc->tunq_coalesce == 0 && pi->link_config.link_ok &&
+ TXQ_RING_EMPTY(qs)) {
if (t3_encap(qs, &m, 1)) {
if (m != NULL &&
(error = drbr_enqueue(ifp, br, m)) != 0)
@@ -1542,7 +1594,7 @@ cxgb_transmit_locked(struct ifnet *ifp,
} else if ((error = drbr_enqueue(ifp, br, m)) != 0)
return (error);
- if (!TXQ_RING_EMPTY(qs))
+ if (!TXQ_RING_EMPTY(qs) && pi->link_config.link_ok)
cxgb_start_locked(qs);
return (0);
More information about the svn-src-user
mailing list