From owner-svn-src-user@FreeBSD.ORG Fri Jun 5 00:05:26 2009 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 13AFB106566C; Fri, 5 Jun 2009 00:05:26 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 021558FC1F; Fri, 5 Jun 2009 00:05:26 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n5505Pbh008679; Fri, 5 Jun 2009 00:05:25 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n5505PqP008677; Fri, 5 Jun 2009 00:05:25 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906050005.n5505PqP008677@svn.freebsd.org> From: Kip Macy Date: Fri, 5 Jun 2009 00:05:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r193476 - user/kmacy/releng_7_2_fcs/sys/dev/cxgb X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Jun 2009 00:05:26 -0000 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);