From owner-svn-src-user@FreeBSD.ORG Fri Jun 5 23:22:16 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 249E310656C2; Fri, 5 Jun 2009 23:22:16 +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 ED17F8FC0A; Fri, 5 Jun 2009 23:22:15 +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 n55NMFpT041193; Fri, 5 Jun 2009 23:22:15 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n55NMF1o041192; Fri, 5 Jun 2009 23:22:15 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200906052322.n55NMF1o041192@svn.freebsd.org> From: Kip Macy Date: Fri, 5 Jun 2009 23:22:15 +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: r193544 - 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 23:22:16 -0000 Author: kmacy Date: Fri Jun 5 23:22:15 2009 New Revision: 193544 URL: http://svn.freebsd.org/changeset/base/193544 Log: - ensure that we don't try to chain more than 7 packets - defer call to start if we're coalescing and there are fewer than 7 packets in the sw queue Modified: user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c 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 Fri Jun 5 23:21:29 2009 (r193543) +++ user/kmacy/releng_7_2_fcs/sys/dev/cxgb/cxgb_sge.c Fri Jun 5 23:22:15 2009 (r193544) @@ -1485,16 +1485,26 @@ t3_encap(struct sge_qset *qs, struct mbu return (0); } +struct coalesce_info { + int count; + int nbytes; +}; + + static int coalesce_check(struct mbuf *m, void *arg) { - uintptr_t *nbytes = (uintptr_t *)arg; + struct coalesce_info *ci = arg; + int *count = &ci->count; + int *nbytes = &ci->nbytes; - if (*nbytes == 0) + if (*nbytes == 0) { + *count = 1; return (1); - else if (m->m_next != NULL) + } else if ((m->m_next != NULL) && (*count > 6)) return (0); else if (*nbytes + m->m_len <= 10500) { + *count += 1; *nbytes += m->m_len; return (1); } @@ -1503,18 +1513,17 @@ coalesce_check(struct mbuf *m, void *arg } static struct mbuf * -cxgb_dequeue_chain(struct sge_qset *qs, int *count) +cxgb_dequeue_chain(struct sge_qset *qs, struct coalesce_info *ci) { - int nbytes = 0; struct mbuf *m, *m_head, *m_tail; m_head = m_tail = NULL; + ci->nbytes = 0; do { - m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &nbytes); + m = TXQ_RING_DEQUEUE_COND(qs, coalesce_check, &ci); if (m_head == NULL) { m_tail = m_head = m; } else if (m != NULL) { - *count += 1; m_tail->m_nextpkt = m; m_tail = m; } @@ -1534,6 +1543,7 @@ cxgb_start_locked(struct sge_qset *qs) struct adapter *sc = pi->adapter; struct ifnet *ifp = pi->ifp; int count, avail; + struct coalesce_info ci; avail = txq->size - txq->in_use - 4; txmax = min(TX_START_MAX_DESC, avail); @@ -1546,7 +1556,7 @@ cxgb_start_locked(struct sge_qset *qs) count = 1; if (sc->tunq_coalesce) - m_head = cxgb_dequeue_chain(qs, &count); + m_head = cxgb_dequeue_chain(qs, &ci); else m_head = TXQ_RING_DEQUEUE(qs); @@ -1556,7 +1566,7 @@ cxgb_start_locked(struct sge_qset *qs) * Encapsulation can modify our pointer, and or make it * NULL on failure. In that event, we can't requeue. */ - if (t3_encap(qs, &m_head, count)) + if (t3_encap(qs, &m_head, ci.count)) break; /* Send a copy of the frame to the BPF listener */ @@ -1625,7 +1635,8 @@ cxgb_transmit_locked(struct ifnet *ifp, } else if ((error = drbr_enqueue(ifp, br, m)) != 0) return (error); - if (!TXQ_RING_EMPTY(qs) && pi->link_config.link_ok) + if (!TXQ_RING_EMPTY(qs) && pi->link_config.link_ok && + (!sc->tunq_coalesce || (drbr_inuse(ifp, br) >= 7))) cxgb_start_locked(qs); return (0);